如何在Groovy中按Key分组并聚合JSON中的其他字段
Groovy JSON分组转换实现方案
完整代码示例
import groovy.json.JsonSlurper import groovy.json.JsonBuilder // 注意:原输入JSON存在语法错误,第一个对象的"status": "progress"后缺少逗号,需修正后执行 def inputJson = '''[ { "login": "nickname1", "status": "progress", "days": 8 }, { "login": "nickname2", "status": "progress", "days": 4 }, { "login": "nickname1", "status": "new", "days": 3 }, { "login": "nickname2", "status": "new", "days": 1 }]''' // 解析JSON字符串为Groovy集合 def data = new JsonSlurper().parseText(inputJson) // 按login分组并转换目标格式 def result = data.groupBy { it.login }.collect { login, entries -> def item = [login: login] // 将status转为键、days转为对应值 entries.each { entry -> item[entry.status] = entry.days } // 计算总天数 item.total = entries.sum { it.days } item } // 输出格式化后的JSON结果 println new JsonBuilder(result).toPrettyString()
步骤说明
- 修正输入JSON:原输入中第一个对象的
"status": "progress"行末尾缺失逗号,这会导致解析失败,需先修正语法错误。 - 解析JSON:通过
JsonSlurper将JSON字符串转换为Groovy可操作的集合对象。 - 分组处理:使用
groupBy { it.login }将数据按login字段分组,得到键为login、值为对应条目列表的Map。 - 结构转换:
- 为每个分组初始化包含
login的Map。 - 遍历分组内的每个条目,将
status作为键、days作为值存入Map。 - 调用
sum方法计算该login的总天数,存入total字段。
- 为每个分组初始化包含
- 生成结果JSON:用
JsonBuilder将转换后的集合转为格式化的JSON字符串输出。
内容的提问来源于stack exchange,提问作者user24205092
相关产品推荐
相关产品推荐

