Groovy如何将JSON顶层字段与stats子数组合并为扁平化结构
问题原因
你代码的错误出在内层遍历逻辑:
- 你对单条stat数据(也就是代码里的
b,本身是Map结构)调用了collect方法,遍历Map的每个键值对时,你都返回只包含id和type的新对象,完全没有把stat本身的字段合并进去,最终结果自然只会保留这两个字段 - 内层对stats数组不需要使用
collectMany,多余的打平操作反而会增加额外遍历开销
collect与collectMany的区别
collect:遍历集合元素,按闭包逻辑转换每个元素,返回和原集合长度一致的新集合,不会处理嵌套结构。比如输入[[1,2],[3,4]],执行collect{it}返回的还是[[1,2],[3,4]]collectMany:遍历集合元素,将每个元素转换后得到的集合自动拼接、打平为一维集合。比如输入[[1,2],[3,4]],执行collectMany{it}返回的是[1,2,3,4]
正确实现代码
def json = new JsonSlurper().parseText(text) def result = json.collectMany { topItem -> // 提取顶层公共字段 def common = [id: topItem.id, type: topItem.type] // 每个stat项和公共字段合并 topItem.stats.collect { stat -> common + stat } }
Groovy的Map支持直接用+运算符合并两个Map的键值对,刚好匹配你要的字段合并需求,外层用collectMany把所有顶层对象生成的stat合并列表打平为一维数组,输出和你要求的结构完全一致。
内容的提问来源于stack exchange,提问作者doiposle
相关产品推荐
相关产品推荐

