如何使用Groovy统计JSON数组中Role_Name的出现次数
需求与Groovy代码完善方案
需求说明
需要统计输入JSON数组中,每个Organization对应的各Role_Name在其Roles列表内的出现次数,并输出指定格式的JSON结果。
输入JSON示例
[ { "Organization": "Global", "Roles": [ { "Role_Name": "Talent Partner" }, { "Role_Name": "Partner" } ] }, { "Organization": "Mfg", "Roles": [ { "Role_Name": "Talent Partner" } ] } ]
期望输出JSON示例
[ { "Organization": "Global", "Talent Partner": "1", "Partner": "1" }, { "Organization": "Mfg", "Talent Partner": "1" } ]
现有代码问题
现有Groovy代码存在以下问题:
- 仅统计了
Talent Partner这一种角色的次数,未处理所有Role_Name - 未按
Organization分组统计,直接操作整个jsonDoc.Roles会导致跨组织统计错误 - 存在语法错误:
if条件中括号不匹配,代码末尾有多余的闭合大括号
完善后的Groovy代码
import groovy.json.JsonSlurper import groovy.json.JsonOutput def slurper = new JsonSlurper() def jsonDoc = slurper.parseText(doc) // 遍历每个组织,统计角色出现次数 def result = jsonDoc.collect { org -> // 按角色名分组并计数,转换为「角色名: 次数字符串」的键值对 def roleCounts = org.Roles.groupBy { it.Role_Name.trim() } .collectEntries { role, roleList -> [(role): roleList.size().toString()] } // 组合组织名称与统计结果 [Organization: org.Organization] + roleCounts } // 生成JSON输出流 def outputJson = JsonOutput.toJson(result) is = new ByteArrayInputStream(outputJson.getBytes()) dataContext.storeStream(is, props)
代码说明
- 组织遍历:用
collect方法逐个处理输入中的每个组织对象 - 角色统计:通过
groupBy按角色名分组,再用collectEntries将分组结果转换为要求的键值对格式,次数转为字符串类型 - 结果构建:将组织名称和角色统计结果合并为一个Map对象
- 输出处理:把结果列表转为JSON字符串,写入输出流完成输出
内容的提问来源于stack exchange,提问作者Bilkish Fatima
相关产品推荐
相关产品推荐

