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

Groovy中用JsonBuilder修改JSON整数元素遇值转字符串问题

解决Groovy中JsonBuilder更新整数字段转为字符串的问题

问题背景

现有JSON结构:

def jsonString = '{"studyDTO":{"studyId":191,"studyCode":"test_ispptest2"},"sites":[{"studyId":191,"siteRecid":16521,"siteId":"11001"}],"allSubjects":true,"states":null,"visits":[{"studyId":191,"visitSubmitName":"baseline","visitDisplayName":"Baseline","orderOfDisplay":10}],"modalities":null,"examDates":null,"series":null,"transferType":null,"sftpLocations":[],"dicomLocations":[],"fileSystemLocations":[],"rawFileSystemLocations":[],"customFolder":null,"folderStructure":null,"customFile":null,"fileStructure":null,"includePS":null}'

需要动态使用数据源中的整数更新orderOfDisplay字段,编写了如下Groovy代码(示例值为23,实际需循环10次动态变更):

def jsonConvert = new JsonSlurper();
def object = jsonConvert.parseText(jsonString);
def builder = new JsonBuilder(object)

builder.content.visits[0].orderOfDisplay = 23

log.info(builder.toPrettyString());

运行后发现更新后的整数被转为字符串(如23变为"23"),需解决该类型异常。

解决方法

1. 显式匹配原始字段类型

JsonSlurper默认会将JSON数值解析为BigDecimal类型,直接赋值普通整数会导致类型不匹配,序列化时转为字符串。可将赋值的整数转为BigDecimal:

builder.content.visits[0].orderOfDisplay = new BigDecimal(23)

2. 指定JsonSlurper的整数解析模式

解析JSON时设置类型模式,让数值直接解析为Integer,后续赋值普通整数就不会出现类型转换问题:

def jsonConvert = new JsonSlurper().setType(JsonParserType.INTEGER_MODE);
def object = jsonConvert.parseText(jsonString);
def builder = new JsonBuilder(object)

builder.content.visits[0].orderOfDisplay = 23

3. 直接修改原始解析对象

跳过builder.content的中间修改,直接修改JsonSlurper解析后的原始对象,再用JsonBuilder重新构建:

def jsonConvert = new JsonSlurper();
def object = jsonConvert.parseText(jsonString);
object.visits[0].orderOfDisplay = 23
def builder = new JsonBuilder(object)

log.info(builder.toPrettyString());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:54:19