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

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

代码说明

  1. 组织遍历:用collect方法逐个处理输入中的每个组织对象
  2. 角色统计:通过groupBy按角色名分组,再用collectEntries将分组结果转换为要求的键值对格式,次数转为字符串类型
  3. 结果构建:将组织名称和角色统计结果合并为一个Map对象
  4. 输出处理:把结果列表转为JSON字符串,写入输出流完成输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:45:38