如何在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
相关产品推荐
相关产品推荐

