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

如何移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:18:09