如何用Groovy删除列表中指定项目的JSON对象及关联projLink条目
Groovy处理JSON:删除指定项目及关联链接条目
我是Groovy新手,需要根据传入参数projectNameToDelete的值,完成两个操作:
- 删除JSON列表中
projectName等于该参数的对象 - 删除其他项目的
projLink列表中,包含该参数作为键的条目
我的JSON数据如下:
[ { "projectName": "test-1", "Team": "WSIT", "Num": "1", "projLink": [{"proj1": "read"}, {"proj2": "write"}], "change": "false", "repository": "https://github.com/org/repo.git", "type": "app", "ID": "777321" }, { "projectName": "proj2", "Team": "WSIT", "Num": "1", "projLink": [{"proj3": "read"}, {"proj5": "write"}], "change": "false", "repository": "https://github.com/org/repo.git", "type": "app", "ID": "777321" } ]
例如当参数值为proj2时,需删除projectName为proj2的JSON对象,同时删除test-1项目的projLink中包含proj2的条目。
我尝试了以下代码,但无法移除projLink中的对应条目,请问该如何实现?
List<Map<String, String>> toRemove = [] jsonArray.each { jsonObject -> def projLink = jsonObject.projLink if (projLink instanceof List) { projLink.eachWithIndex {map,index -> if (map.containsKey(projectNameToDelete)) { toRemove << map println "check the loop" } } projLink.removeAll(toRemove) } }
解决方案
问题分析
你的代码有两个核心问题:
- 全局的
toRemove列表会累积所有符合条件的条目,遍历多个项目时可能导致重复删除或误操作 - 缺少删除整个
projectName匹配的项目对象的逻辑
正确实现代码
def projectNameToDelete = "proj2" def jsonSlurper = new groovy.json.JsonSlurper() // 解析JSON数据(如果已有解析好的jsonArray可跳过此步骤) def jsonArray = jsonSlurper.parseText('''[ { "projectName": "test-1", "Team": "WSIT", "Num": "1", "projLink": [{"proj1": "read"}, {"proj2": "write"}], "change": "false", "repository": "https://github.com/org/repo.git", "type": "app", "ID": "777321" }, { "projectName": "proj2", "Team": "WSIT", "Num": "1", "projLink": [{"proj3": "read"}, {"proj5": "write"}], "change": "false", "repository": "https://github.com/org/repo.git", "type": "app", "ID": "777321" } ]''') // 1. 删除所有projectName匹配的项目对象 jsonArray.removeAll { it.projectName == projectNameToDelete } // 2. 遍历剩余项目,清理projLink中包含目标名称的条目 jsonArray.each { project -> if (project.projLink instanceof List) { // 过滤掉projLink中键为projectNameToDelete的条目 project.projLink = project.projLink.findAll { linkMap -> !linkMap.containsKey(projectNameToDelete) } } } // 输出处理后的结果 println groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(jsonArray))
代码说明
- 删除项目对象:使用
removeAll结合闭包,直接过滤掉projectName匹配的元素,简洁高效 - 清理projLink条目:对每个项目的
projLink列表,用findAll生成新列表,只保留不包含目标键的条目并重新赋值。这种方式比收集要删除的元素再移除更直观,也避免了全局变量带来的问题
内容的提问来源于stack exchange,提问作者jarvis_max
相关产品推荐
相关产品推荐

