如何使用JMESPATH从JSON中按name分组聚合同key的value列表
JMESPath按name字段分组聚合value数组方案
问题场景
给定输入JSON数组(已修正原示例的语法错误):
[ { "name" : "a1", "value": null }, { "name" : "a2", "value": 3 }, { "name" : "a1", "value": 4 }, { "name" : "a2", "value": 6 } ]
需要通过单条JMESPath查询,将相同name的项聚合,输出如下结构:
[ { "name": "a1", "value": [null, 4] }, { "name": "a2", "value": [3, 6] } ]
此前尝试的分步提取name再过滤的方案需要多次查询,无法满足单条语句实现的要求。
可用查询语句
直接使用如下JMESPath即可得到目标结果:
[*].name | unique(@) | [*].{"name": @, "value": $parent[?name == @].value}
语句逻辑拆解
[*].name:遍历原始数组提取所有name字段值,得到初始name列表unique(@):对name列表去重,得到最终的分组键集合["a1", "a2"]- 最后遍历每个分组键,构造新对象:
name字段赋值为当前遍历到的分组名value字段从原始数组中筛选所有name等于当前分组名的项,提取其value值组成数组,会自动保留null值、保持原始出现顺序
*提示:如果使用的JMESPath实现不支持$parent上下文引用,可以使用全兼容写法,效果完全一致:
{"source": @, "group_keys": [*].name | unique(@)} | group_keys[*].{"name": @, "value": $root.source[?name == @].value}
内容的提问来源于stack exchange,提问作者Abinash Biswal
相关产品推荐
相关产品推荐

