首页 > 解决方案 > 使用jq将子文件合并到主文件中

问题描述

有很多jq关于合并 JSON 文档的相关问题,但它们似乎都是关于合并具有相同结构的文档。

我的问题不同,因为我需要将子文档合并到父文档中,其中子文档和父文档具有不同的结构。

父文档如下所示:

{
  "resources": [
    {
      "name": "child0",
      "properties": {
        "template": {}
      }
    },
    {
      "name": "child1",
      "properties": {
        "template": {}
      }
    },
    {
      "name": "child2",
      "properties": {
        "template": {}
      }
    }
  ]
}

我需要做的是在子文档中合并.resources[].properties.template,例如第一个文件在.resources[0].properties.template,第二个文件在.resources[1].properties.template等。

请注意,子文档的结构在这里并不重要,因为我想将它们全部合并。

我实际上已经让它工作了,但是使用了多个命令:

jq '.resources[0].properties.template += input' main.json child0.json > temp0.json
jq '.resources[1].properties.template += input' temp0.json child1.json > temp1.json
jq '.resources[2].properties.template += input' temp1.json child2.json > temp2.json
mv temp2.json merged.json
rm temp*.json

这很丑 - 我正在寻找一个jq可以合并到子文件中的命令。

标签: jsonmergejq

解决方案


你很亲密。假设对象的resources数量等于子文档的数量,这应该可以解决问题:

jq '.resources[].properties.template |= . + input' parent children...

jqplay.org 上的演示


推荐阅读