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
相关产品推荐
相关产品推荐

