gpt4 book ai didi

json - 如何添加一个新的 {key :value} per array element merging others identically structured JSON with jq

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:07 24 4
gpt4 key购买 nike

当前的 JSON 数据库,文件 db.json,结构如下:

[
{
"foo": {
"key_1": "value_1.1",
"key_2": "value_2.1"
}
},
{
"foo": {
"key_1": "value_1.2",
"key_2": "value_2.2"
}
},
...
]

就这么简单。数组中的总元素数可以变化。我想加入位于几个相同结构的文档中的 key ,文件new.json:

[
{
"foo": {
"key_n": "value_1.N"
}
},
{
"foo": {
"key_n": "value_2.N"
}
},
...
]

要添加的每个 JSON 中的数组在当前数据库中肯定具有相同数量的元素,并且每个“条目”元素:
- 它肯定只包含一个 key 。
- 可以肯定的是, key 及其字符串值始终存在。
- 与数据库中已有的 key 相比, key 肯定具有唯一的名称。

因此,每次jq执行后,预期的结果都会是在对应的数组元素中添加新的key到数据库中:

[
{
"foo": {
"key_1": "value_1.1",
"key_2": "value_1.2",
"key_n": "value_1.N"
}
},
{
"foo": {
"key_1": "value_2.1",
"key_2": "value_2.2",
"key_n": "value_2.N"
}
},
...
]

我使用 linux 并希望通过 bash 脚本使用 jq 来执行此操作。我的 Linux 发行版提供了 jq 1.5 稳定版(2015 年 8 月 16 日)。

我想问一些已经被广泛讨论过的琐碎问题,但我向你保证:两天来我一直在应用在其他非常相似的问题中找到的答案,但我没有成功...

我可以使用这种技术插入一个新 key ,我在许多其他关于合并的堆栈溢出响应中发现了这种技术:

jq -s --argfile db db.json 'map(reduce . as $new ({}; $db[] * $new[]))' new.json

但这样只有最后一个元素保留在我的 db.json 文件中..

[
{
"foo": {
"key_1": "value_2.1",
"key_2": "value_2.2",
"key_n": "value_2.N"
}
}
]

使用 + 运算符时:

jq -s --argfile db db.json 'reduce . as $new ({}; $db + $new)' new.json 

如预期的那样,元素的合并没有实现..

[
{
"foo": {
"key_1": "value_1.1",
"key_2": "value_1.2"
}
},
{
"foo": {
"key_1": "value_2.1",
"key_2": "value_2.2"
}
},
{
"foo": {
"key_n": "value_1.N"
}
},
{
"foo": {
"key_n": "value_2.N"
}
}
]

结果更新
嗯,看来我刚才尝试的这个命令可以正确完成所有工作:

jq -s --argfile db db.json 'map($db[] * .[]) | unique_by(.foo)' new.json

unique_by(.foo) 删除了我仅使用 * 运算符的所有递归重复项..
在您看来,这是否是解决我的问题的一致技术?

最佳答案

修改 db.json 和 new.json 使它们成为有效的 JSON,并将以下过滤器添加到文件 (update.jq) 之后:

reduce range(0;length) as $i (.;
.[$i].foo += $new[$i].foo )

以下调用:

jq --argfile new new.json -f update.jq db.json

产生:

[
{
"foo": {
"key_1": "value_1.1",
"key_2": "value_1.2",
"key_n": "value_N.3"
}
},
{
"foo": {
"key_1": "value_2.1",
"key_2": "value_2.2",
"key_n": "value_N.3"
}
}
]

关于json - 如何添加一个新的 {key :value} per array element merging others identically structured JSON with jq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51609844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com