You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:42:43