如何在Groovy中访问、遍历嵌套JSON并修改指定字段值
解决Groovy中嵌套JSON的字段修改问题
需求说明
需要在Groovy中读取并修改嵌套JSON的指定字段:
- 修改根节点
address下的countryId、countryName(按需修改continentName) - 遍历
parentOrganizations数组,修改每个元素的address下的continentName和countryName
原JSON结构:
{ "dunsNumber": 0, "branches": 25, "url": "www.nbch.com.com", "address": { "continentId": 5, "continentName": "South & Central America", "countryId": 20, "countryName": "Brasil" }, "parentOrganizations": [ { "parentType": "IMMEDIATE", "name": "abcde", "dunsNumber": "12345", "address": { "continentId": 5, "continentName": "Europe", "countryId": 33, "countryName": "France" } } ] }
期望修改后的address示例:
"address": { "continentId": 5, "continentName": "South & Central America", "countryId": 33, "countryName": "Argentina" }
问题重现
之前的代码直接在根节点调用put("countryName","Argentina"),会在根节点新增字段,无法修改嵌套的address内部值:
def raw = loadResourceContent("createOrganization1.json") // 加载Json文件 def body = new JSONObject(raw) .put("dunsNumber", dunsNumberUnique) // 使用唯一值 .put("name",organizatioNameUnique) // 随机组织名称 .put("countryName","Argentina") // 在根节点新增了字段 .toString()
正确实现
需要先获取嵌套的address对象,再修改其内部字段;数组则需要遍历每个元素处理:
// 加载JSON文件内容 def raw = loadResourceContent("createOrganization1.json") // 解析为JSONObject def body = new JSONObject(raw) // 1. 修改根节点的address字段 def rootAddress = body.getJSONObject("address") rootAddress.put("countryId", 33) rootAddress.put("countryName", "Argentina") // 如需修改continentName,取消下面注释 // rootAddress.put("continentName", "自定义大洲名称") // 2. 遍历parentOrganizations数组,修改每个元素的address def parentOrgArray = body.getJSONArray("parentOrganizations") for (int i = 0; i < parentOrgArray.length(); i++) { def parentOrg = parentOrgArray.getJSONObject(i) def parentAddress = parentOrg.getJSONObject("address") parentAddress.put("continentName", "South & Central America") parentAddress.put("countryName", "Argentina") // 如需修改countryId,取消下面注释 // parentAddress.put("countryId", 33) } // 3. 设置根节点的其他字段 body.put("dunsNumber", dunsNumberUnique) body.put("name", organizatioNameUnique) // 转换为修改后的JSON字符串 def modifiedJson = body.toString()
可选链式写法(可读性稍弱)
如果偏好链式调用风格,也可以这样写:
def raw = loadResourceContent("createOrganization1.json") def body = new JSONObject(raw) // 设置根节点字段 .put("dunsNumber", dunsNumberUnique) .put("name", organizatioNameUnique) // 修改根节点address .getJSONObject("address") .put("countryId", 33) .put("countryName", "Argentina") .end() // 返回根对象 // 遍历并修改数组内的address .getJSONArray("parentOrganizations") .forEach { org -> org.getJSONObject("address") .put("continentName", "South & Central America") .put("countryName", "Argentina") } def modifiedJson = body.toString()
内容的提问来源于stack exchange,提问作者Albrown
相关产品推荐
相关产品推荐

