如何移除JSON指定键值、节点及数组括号?Groovy调试求助
解决JSON修改的问题
我来帮你搞定这个JSON修改的需求,先拆解下你之前尝试的问题,再给你靠谱的解决方案:
先说说你之前两种方法的问题
- 第一种字符串replaceAll的方式:直接操作JSON字符串是非常不严谨的,JSON的格式可能存在空格、换行、引号位置变化等情况,正则或字符串替换很容易匹配失败。而且你代码里替换的是
"max",自然不会移除count,方向完全错了。 - 第二种操作JSON对象的方式:原JSON里
details是一个数组(用[]包裹),你直接写json.details.goBus是找不到这个属性的,必须先取出数组里的第一个元素,再去操作里面的节点,所以才会返回false。
正确的解决方案(优先操作解析后的JSON对象)
我们用JsonSlurper把JSON解析成Groovy的Map/List对象,直接操作键值对,这种方式稳定可靠,不会因为格式变化出错:
def desiredJson = '{"count": 4, "max": "12", "min": 0, "details": [{"goBus": {"first": 12800, "second": 11900, "third": 12800},"goAir": {"first": 12800, "second": 11900, "third": 12800}, "gotTrain": {"first": 12800, "second": 11900},"sell": true, "darn": 2,"rate": [{ "busRate": 11900, "flag": false, "percent": 0}],}],}' // 1. 解析JSON为可操作的Groovy对象 def jsonSlurper = new JsonSlurper() def jsonObj = jsonSlurper.parseText(desiredJson) // 2. 移除顶层的"count"键值对 jsonObj.remove('count') // 3. 处理details节点:移除数组括号,同时删除goBus子节点 if (jsonObj.details instanceof List && jsonObj.details.size() > 0) { def detailItem = jsonObj.details[0] // 移除当前detail对象里的goBus节点 detailItem.remove('goBus') // 把details从数组替换成单个对象,去掉方括号 jsonObj.details = detailItem } // 4. 输出格式化后的结果JSON def resultJson = JsonOutput.prettyPrint(JsonOutput.toJson(jsonObj)) log.info resultJson
这段代码执行后,会得到你想要的结果:
- 没有
count键值对 details不再是数组(去掉了方括号)details里的goBus节点已被移除
关于replaceAll的疑问
理论上可以用replaceAll配合正则来移除这些内容,但极度不推荐:
- JSON的格式可能存在各种变体(比如键名前后加空格、换行),正则很难覆盖所有情况,容易出现误替换或漏替换。
- 如果JSON里的字符串值包含和键名、括号类似的内容,会被错误匹配替换。
只有当你能100%保证JSON的格式完全固定(没有任何额外空格、换行),才可以尝试正则,但这种场景非常少见,所以优先推荐操作解析后的JSON对象。
内容的提问来源于stack exchange,提问作者avidCoder
相关产品推荐
相关产品推荐

