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

如何用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)
    }
}

解决方案

问题分析

你的代码有两个核心问题:

  1. 全局的toRemove列表会累积所有符合条件的条目,遍历多个项目时可能导致重复删除或误操作
  2. 缺少删除整个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:52:52