如何为每个数组元素添加新的{key:value}并将其他结构相同的JSON与jq合并

时间:2018-07-31 09:20:53

标签: json linux bash jq

当前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)删除所有我仅使用*运算符的递归重复项。.
在您看来,这是否是解决我的问题的一致技术?

1 个答案:

答案 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