如何扩展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
相关产品推荐
相关产品推荐

