如何通过JSON值从嵌套JSON对象列表中获取索引-Groovy



拥有这个json文件:

{
"rolesToAdd": [],
"rolesToModify": [
{
"name": "administrator",
"nativeRole": "AdminUser",
"description": "Administrator role",
"permissions": [
{
"operation": "CanAcceptRequest",
"name": "Can admin accept request",
"value": false
},
{
"operation": "CanSeeRequest",
"name": "Can admin see request",
"value": false
}
]
},
{
"name": "simpleUser",
"nativeRole": "User",
"description": "User role",
"permissions": [
{
"operation": "CanPostRequest",
"name": "Can user post request",
"value": false
},
{
"operation": "CanCancel",
"name": "Can user cancel request",
"value": false
}
]
}
]
}

我需要更改这个json中的值。我写了这样的方法来做到这一点:

Map configMap = ReadAboveJson()
def setAdminCanSeeRequest(boolean canSee) {
configMap.rolesToModify[0].permissions[1].value = canSee
}
def setUserCanPostRequest(boolean canPost) {
configMap.rolesToModify[1].permissions[0].value = canPost
}

如何编写这些方法,以便他们能够通过等于"administrator"的键"name"在rolesToModify列表中找到元素的索引,然后能够通过等于"CanSeeRequest"的键"operation"在权限列表中找到索引?

我试着做这样的事情:

int rolesToModifyIndex = configMap.rolesToModify.findIndexOf { object -> object.name == "administrator"}

但它不起作用。将感谢您的帮助。

检查ReadAboveJson方法的代码,可能存在一些问题,因为findIndexOf的工作原理如您所述:

import groovy.json.JsonSlurper
def input = '''{
"rolesToAdd": [],
"rolesToModify": [
{
"name": "administrator",
"nativeRole": "AdminUser",
"description": "Administrator role",
"permissions": [
{
"operation": "CanAcceptRequest",
"name": "Can admin accept request",
"value": false
},
{
"operation": "CanSeeRequest",
"name": "Can admin see request",
"value": false
}
]
},
{
"name": "simpleUser",
"nativeRole": "User",
"description": "User role",
"permissions": [
{
"operation": "CanPostRequest",
"name": "Can user post request",
"value": false
},
{
"operation": "CanCancel",
"name": "Can user cancel request",
"value": false
}
]
}
]
}
'''
def json = new JsonSlurper().parseText(input)
assert json.rolesToModify.findIndexOf { it.name == 'simpleUser' } == 1
assert json.rolesToModify.findIndexOf { it.name == 'administrator' } == 0

然而,您可以使用find方法中更简单的方法,该方法可以返回给定名称的角色,例如:

def user = json.rolesToModify.find { it.name == 'simpleUser' }
assert user.name == 'simpleUser'
assert user.permissions[0].value == false
请注意,JSON无效。假设简单的修正,和这样的设置:
def setAdminCanSeeRequest = { def configMap, def canSee ->
myFind(configMap)["value"] = canSee
configMap
}

那么问题可以指定如下:

def configMap = new groovy.json.JsonSlurper().parseText(s)
assert ! myFind(configMap)["value"]
configMap = setAdminCanSeeRequest(configMap, true)
assert myFind(configMap)["value"]

CCD_ 4的实现是:

def myFind = { def configMap ->
configMap.rolesToModify.find { 
it['name'] == 'administrator'
}['permissions'].find {
it['operation'] = 'CanSeeRequest'
}
}

根据需要直接向myFind添加参数。

最新更新