Groovy使用JsonBuilder按路径删除JSON节点报错如何修复
错误原因
- 你定义的
diffOfApi字符串不符合标准JSON格式:所有属性名(op/path/value)和字符串类型的属性值都没有加双引号,JsonSlurper默认只能解析标准格式JSON,直接报错。 - 过滤操作调用对象错误:
JsonBuilder是用来生成JSON字符串的工具类,本身不支持集合的removeAll方法,你需要对JsonSlurper解析得到的集合对象执行过滤。
修复后代码
import groovy.json.JsonSlurper import groovy.json.JsonBuilder String pathPrefix = "/server_information/environment" String pathSuffix = "/server_information/environment" // 修正JSON格式:所有字符串属性、值补充双引号 String diffOfApi = """[{"op":"replace", "path":"/server_information/environment", "value":"QCSGERFX023"}, {"op":"replace", "path":"/json_detail/pick_batch/0/support_list/0/already_send", "value":false}]""" JsonSlurper slurper = new JsonSlurper() def slurped = slurper.parseText(diffOfApi) println "removeDiffByPath() - avant removeAll parsedJsonDiff : $slurped" // 对解析得到的集合执行过滤 slurped.removeAll { it.path.contains(pathPrefix) && it.path.contains(pathSuffix) } println "removeDiffByPath() - apres removeAll parsedJsonDiff : $slurped" // 过滤完成后再构造JsonBuilder输出结果 def parsedJsonDiff = new JsonBuilder(slurped) println parsedJsonDiff.toString()
可选优化方案
如果你拿到的原始JSON确实没有双引号,不想修改原始JSON字符串,可以开启JsonSlurper的宽松解析模式,不需要调整JSON内容就能完成解析:
// 替换原来的解析逻辑即可 def slurped = new JsonSlurper().setLax(true).parseText(diffOfApi)
内容的提问来源于stack exchange,提问作者Sebastien TANIERE
相关产品推荐
相关产品推荐

