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

如何用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实现(比如你用的在线工具)提供了自定义函数来实现这个需求。

针对你用的工具,可以试试这两种写法:

  1. 使用reduce函数(工具需支持):
$..nodes.* | reduce $item ({}; $current[$item.code] = $item.label)
  1. 若工具支持merge聚合函数,也可以这样写:
$..nodes.* | map({$[code]: $[label]}) | merge

注意:不同JSONPath实现的语法差别很大,上面的表达式可能需要根据工具调整。如果工具不支持这类扩展功能,仅靠标准JSONPath没法完成对象合并,只能先提取键值对数组,再用其他代码(比如JavaScript)转成对象。

内容的提问来源于stack exchange,提问作者Albert-Jan Roskam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:14