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

Groovy Builder构建JSON时插入JSONArray失败问题求助

问题解决:Groovy JsonBuilder 插入数组错误修正

错误原因分析

你的代码存在两个核心问题:

  1. 重复使用同一个JsonBuilder实例,第二次调用builder {}会覆盖之前的结构,导致json2的内容被破坏。
  2. 直接插入json2对象会把整个包含subscribedCountries键的Map嵌套进去,而非你需要的数组本身。

修正方案一(最简洁写法)

直接用Groovy原生List构建subscribedCountries数组,再嵌套进整个JSON结构:

import groovy.json.JsonBuilder;

// 先构建订阅国家的列表(无需额外JsonBuilder)
def subscribedCountries = []
for(int i=2;i<=20;i++){
    subscribedCountries.add([
        currencyId: vars.get('currencyId_'+i),
        countryId: vars.get('countryId_'+i),
        status:'Active'
    ])
}

// 构建完整的JSON Payload
def builder = new JsonBuilder()
builder {
    subscriptions([
        [
            subscriptionsId: '1243232',
            subscriptionName: 'Employee',
            subscribedCountries: subscribedCountries
        ]
    ])
}

// 打印格式化后的JSON
println builder.toPrettyString()

修正方案二(保留分步骤构建)

如果需要分步骤用JsonBuilder构建,需使用独立的Builder实例,并提取数组内容插入:

import groovy.json.JsonBuilder;

// 用独立Builder构建订阅国家数组
def countryBuilder = new JsonBuilder()
def countryJson = countryBuilder {
    subscribedCountries []
}
for(int i=2;i<=20;i++){
    countryJson.subscribedCountries.add([
        currencyId: vars.get('currencyId_'+i),
        countryId: vars.get('countryId_'+i),
        status:'Active'
    ])
}

// 用另一个Builder构建主结构
def mainBuilder = new JsonBuilder()
def mainJson = mainBuilder {
    subscriptions([
        [
            subscriptionsId: '1243232',
            subscriptionName: 'Employee',
            subscribedCountries: countryJson.subscribedCountries
        ]
    ])
}

println mainBuilder.toPrettyString()

关键注意事项

  • 每个独立的JSON结构要使用单独的JsonBuilder实例,避免内容覆盖。
  • 插入数组时直接传入Groovy List对象,而非包含数组的JSON结构对象。
  • JsonBuilder会自动将Groovy的List/Map转换为对应的JSON数组/对象。

内容的提问来源于stack exchange,提问作者Mandy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:41:10