当前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"
}
},
...
]
很简单。数组中的元素总数可以变化。
我想加入位于几个结构相同的文档中的密钥,文件new.json
:
[
{
"foo": {
"key_n": "value_1.N"
}
},
{
"foo": {
"key_n": "value_2.N"
}
},
...
]
在每个要添加的JSON中,数组肯定具有当前数据库中存在的相同数量的元素,以及每个“ entry”元素:
-它肯定只包含一个键。
-确定键及其字符串值始终存在。
-与数据库中已经存在的密钥相比,该密钥具有唯一的名称。
因此,在每次执行jq之后,预期结果将是将对应数组元素中的新键添加到数据库中:
[
{
"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日)。
我想问一些已经广泛涵盖的琐碎问题,但是我向您保证:两天来,我一直在应用在其他非常相似的问题中找到的答案,但是我没有成功...
我可以使用此技术插入新密钥,该技术在其他许多关于合并的堆栈溢出响应中找到:
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)
删除所有我仅使用*
运算符的递归重复项。.
在您看来,这是否是解决我的问题的一致技术?
答案 0 :(得分:0)
修改db.json和new.json以使其成为有效的JSON,然后将以下过滤器添加到文件(update.jq)中:
document.getElementById(Ext.getCmp("your-Ext_id").getInputId());
以下调用:
reduce range(0;length) as $i (.;
.[$i].foo += $new[$i].foo )
产生:
jq --argfile new new.json -f update.jq db.json