如何用JSONPath实现类似jq中add的结果合并为对象功能?
用JSONPath实现jq的对象合并功能
我用jq工具时,能通过add操作把多个对象合并成一个。现在想找JSONPath里的等效写法,实现下面jq代码的功能:
json="{\"nodes\": [{\"code\": \"DE\", \"label\": \"Germany\", \"ignore\": \"i1\"}, {\"code\": \"NL\", \"label\": \"Netherlands\", \"ignore\": \"i2\"}]}" echo $json | jq '[.nodes[] | {(.code): (.label)}] | add'
这段jq代码的输出是:
{ "DE": "Germany", "NL": "Netherlands" }
我自己写的JSONPath表达式是$..nodes.[*].[code,label],但返回的是数组形式:
["DE", "Germany", "NL", "Netherlands"]
我正在用JSONPath在线工具测试。
解决方案
首先得明确:标准JSONPath本身不支持直接把键值对数组转成单个对象,因为它的定位是提取JSON片段,不是做数据结构转换。不过有些扩展的JSONPath实现(比如你用的在线工具)提供了自定义函数来实现这个需求。
针对你用的工具,可以试试这两种写法:
- 使用
reduce函数(工具需支持):
$..nodes.* | reduce $item ({}; $current[$item.code] = $item.label)
- 若工具支持
merge聚合函数,也可以这样写:
$..nodes.* | map({$[code]: $[label]}) | merge
注意:不同JSONPath实现的语法差别很大,上面的表达式可能需要根据工具调整。如果工具不支持这类扩展功能,仅靠标准JSONPath没法完成对象合并,只能先提取键值对数组,再用其他代码(比如JavaScript)转成对象。
内容的提问来源于stack exchange,提问作者Albert-Jan Roskam
相关产品推荐
相关产品推荐

