【问题标题】:JSON: Modify specific value based on matched key:value of another JSONJSON:根据匹配的键修改特定值:另一个JSON的值
【发布时间】:2020-09-14 06:58:28
【问题描述】:

我有 2 个 JSON 文件,我想根据另一个更新其中一个。 更具体地说,如果一个特定的键:值对在文件之间匹配,我想更新另一个(并且只有一个)键:值对。

a.json 如下所示:

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

b.json 如下:

[
{"i":"1234","f":"555","a":"1"},
{"i":"1235","f":"555","a":"1"},
{"i":"1236","f":"555","a":"1"},
{"i":"1237","f":"555","a":"1"},
{"i":"1238","f":"555","a":"1"}
]

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

[
{"i":"1234","f":"123","a":"1"},
{"i":"1235","f":"123","a":"1"},
{"i":"1236","f":"123","a":"1"},
{"i":"1237","f":"123","a":"1"},
{"i":"1238","f":"123","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","f":"555","a":"0"},
{"i":"1235","f":"555","a":"0"},
{"i":"1236","f":"555","a":"0"},
{"i":"1237","f":"555","a":"0"},
{"i":"1238","f":"555","a":"0"}
]

【问题讨论】:

标签: json match jq


【解决方案1】:

修正输入文件后,可使用以下方法达到预期效果:

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

program.jq 所在的位置:

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

【讨论】:

    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多