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

如何扩展Groovy脚本添加循环逻辑,结合JsonSlurper过滤出value为false的JSON对象

解决嵌套JSON的value筛选问题

你当前的脚本只处理了顶层节点,没考虑嵌套的childNodes,而且用字符串替换的方式很容易破坏JSON结构。这里给你一个递归遍历的方案,能准确筛选出所有value为"false"的节点,同时保留它们的子节点(只要子节点符合条件)。

完整脚本实现

import groovy.json.JsonSlurper
import groovy.json.JsonBuilder

def Message processData(Message message) { 
    // 获取JSON字符串并解析
    def body = message.getBody(java.lang.String) as String 
    def data = new JsonSlurper().parseText(body) 

    // 递归过滤节点的函数
    def filterNodes = { node ->
        // 如果当前节点value是"false",保留它并处理子节点
        if (node.value == "false") {
            // 复制节点(避免修改原数据)
            def filteredNode = [:]
            filteredNode.name = node.name
            filteredNode.value = node.value
            // 如果有childNodes,递归过滤子节点,只保留符合条件的
            if (node.childNodes) {
                def filteredChildren = node.childNodes.collect { filterNodes(it) }.findAll()
                if (filteredChildren) {
                    filteredNode.childNodes = filteredChildren
                }
            }
            return filteredNode
        } else {
            // 如果当前节点不符合,直接返回null(后续会被过滤掉)
            return null
        }
    }

    // 处理顶层数组,过滤后只保留非null的节点
    def filteredData = data.collect { filterNodes(it) }.findAll()

    // 把处理后的对象转回JSON字符串
    def newBody = new JsonBuilder(filteredData).toPrettyString()
    message.setBody(newBody)

    return message 
}

逻辑说明

  • 递归遍历:filterNodes函数会遍历每个节点,包括嵌套的childNodes,确保不会漏掉深层的符合条件节点。
  • 节点保留规则:只有value为"false"的节点会被保留,同时它的childNodes会被递归过滤,只保留其中符合条件的子节点。
  • JSON结构安全:用JsonBuilder重新生成JSON,避免了字符串替换带来的结构破坏问题。

测试效果

输入你的示例JSON:

[
    {
        "name": "1",
        "value": "true",
        "childNodes": [
            {
                "name": "2",
                "value": "true",
                "childNodes": [
                    {
                        "name": "3",
                        "value": "false",
                        "childNodes": [
                            {
                                "name": "4",
                                "value": "false"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

运行脚本后会得到你期望的输出:

[
    {
        "name": "3",
        "value": "false",
        "childNodes": [
            {
                "name": "4",
                "value": "false"
            }
        ]
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:32:32