JSON:根据匹配的key修改特定的值:另一个JSON的值

问题描述

我有2个JSON文件,我想根据另一个更新其中一个更具体地说,如果文件中的特定key:value对匹配,我想更新另一个(也只有另外1个)key:value对。

a.json如下所示:

[
{"i":"1234","f":"123","a":"0"},{"i":"1235",{"i":"1236",{"i":"1237",{"i":"1238","a":"0"}
]

b.json看起来如下:

[
{"i":"1234","f":"555","a":"1"},"a":"1"}
]

我想更新b.json,以便如果b.json的“ i”值与a.json的“ i”值匹配,则“ f”的值将替换为a.json的值。即我希望b.json看起来像这样:

[
{"i":"1234","a":"1"}
]

请注意,仅必须替换f值,而不是a的值。

我已经找到了部分解决方案:

1)制作一个名为update.jq的文件,如下所示:

reduce keys[] as $k (.; if $a|has($k) then .[$k] = $a[$k] else . end)

2)运行:

jq --argfile a a.json -f a.jq b.json 

这给了我f和a都已更新的信息,但我只想更新f。如何确保只有f被更新?

[
{"i":"1234","a":"0"}
]

解决方法

更正输入文件后,可以使用以下方法获得所需的结果:

jq --argfile a a.json -f program.jq b.json

program.jq所在的位置:

(INDEX($a[]; .i) | map_values(.f)) as $dict
| map( .f = $dict[.i] )