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

如何在Linux上用jq 1.5按ID匹配合并JSON对象与数组

用jq根据ID合并两个JSON文件内容的正确方法

现有文件

item.json

{
    "id": "123456",
    "name": "David"
}

list.json

[
    {
        "id": "123456",
        "age": "12"
    },
    {
        "id": "654321",
        "age": "13"
    }
]

需求

遍历list.json数组,将与item.json中id匹配的数组项合并item.json的对象内容,最终得到:

[
    {
        "id": "123456",
        "name": "David",
        "age": "12"
    },
    {
        "id": "654321",
        "age": "13"
    }
]

错误分析

你之前的命令存在语法问题:|=赋值操作符后不能直接使用. += input的写法,而且单独提取ID的方式也不够高效。
错误命令:

jq --arg volid "$(jq -r '."id"' item.json)" '.[] | select(."id" == $volid) |= . += input' list.json

错误提示:

jq: error: syntax error, unexpected += (Unix shell quoting issues?) at , line 1:
.[] | select(."id" == $volid) |= . += input
jq: 1 compile error

正确命令及解释

方法一:使用--slurpfile读取item文件

jq --slurpfile item item.json 'map(if .id == $item[0].id then . + $item[0] else . end)' list.json
  • --slurpfile item item.json:将item.json内容读取为数组,存储到变量$item,$item[0]就是目标对象。
  • map(...):遍历list.json的每个数组元素。
  • 条件判断:匹配ID则合并对象,不匹配则保留原元素。

方法二:使用--argjson直接传入JSON对象

jq --argjson item "$(cat item.json)" 'map(. as $elem | $item + $elem | select(.id == $elem.id) // $elem)' list.json
  • --argjson item "$(cat item.json)":直接将item.json的JSON对象传入jq变量$item。
  • 先合并当前元素与$item,再筛选出ID与原元素一致的结果(确保匹配成功),如果匹配失败则返回原元素。

内容的提问来源于stack exchange,提问作者Xuguang Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:17:47