如何使用jq或任何工具合并json文件?

如何使用jq或任何工具合并json文件?

将问题修改得更具体。将有 2 个 JSON 文件,其中第一个文件只有几个块。正如您所看到的,第二个将有很少的块,并且添加很少的重定向规则

"values": [
  "/businessclass/articles/money.page",
  "/businessclass/articles/1.page",
  "/businessclass/articles/2.page"
],

输出应该是 2 个文件的合并。包括json文件1的更改和Json 2更新的重定向规则。

JSON 文件 1

[
  {
    "name": "caching",
    "options": {
      "behavior": "MAX_AGE",
      "mustRevalidate": false,
      "ttl": "10m",
      "defaultTtl": "30m"
    }
  },
  {
    "name": "/businessclass/articles/money.page",
    "children": [],
    "behaviors": [
      {
        "name": "redirect",
        "options": {
          "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
        }
      }
    ],
    "criteria": [
      {
        "name": "path",
        "options": {
          "matchOperator": "MATCHES_ONE_OF",
          "values": [
            "/businessclass/articles/money.page"
          ],
          "matchCaseSensitive": false
        }
      }
    ],
    "criteriaMustSatisfy": "all",
    "comments": ""
  }
]

JSON 文件 2

{
  "name": "/businessclass/articles/money.page",
  "children": [],
  "behaviors": [
    {
      "name": "redirect",
      "options": {
        "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
      }
    }
  ],
  "criteria": [
    {
      "name": "path",
      "options": {
        "matchOperator": "MATCHES_ONE_OF",
        "values": [
          "/businessclass/articles/money.page",
          "/businessclass/articles/1.page",
          "/businessclass/articles/2.page"
        ],
        "matchCaseSensitive": false
      }
    }
  ],
  "criteriaMustSatisfy": "all",
  "comments": ""
}

预期产出

[
  {
    "name": "caching",
    "options": {
      "behavior": "MAX_AGE",
      "mustRevalidate": false,
      "ttl": "10m",
      "defaultTtl": "30m"
    }
  },
  {
    "name": "/businessclass/articles/money.page",
    "children": [],
    "behaviors": [
      {
        "name": "redirect",
        "options": {
          "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
        }
      }
    ],
    "criteria": [
      {
        "name": "path",
        "options": {
          "matchOperator": "MATCHES_ONE_OF",
          "values": [
            "/businessclass/articles/money.page",
            "/businessclass/articles/1.page",
            "/businessclass/articles/2.page"
          ],
          "matchCaseSensitive": false
        }
      }
    ],
    "criteriaMustSatisfy": "all",
    "comments": ""
  }
]

出色地。规则的顺序可以更改。而且,有时可以将具有新名称的新规则添加到 json 文件中,例如“name”:“/businessclass/articles/money.page”。因此,无论发生什么变化,都必须找到增量并需要相应地合并文件。或者可以创建新的 json 文件,其中也包含合并的更改。

答案1

如果我正确理解你的问题,你只想输出一个包含每个文件中的对象的数组。在这种情况下,-s我们已经为您做到了这一点,所以您只需要

jq -s . file1 file2

如果您需要额外的转换,请编辑问题并给出您需要的简短摘要(我没有逐行比较预期结果与实际输出)。

编辑

我仍然不太确定您需要的转换的一般性质,但如果格式与示例中完全相同,并且您想要的只是将values第一个文件中的字段替换为values第二个文件中的字段内容,并保留其他一切,尝试

jq -s '.[0][1].criteria[0].options.values=.[1].criteria[0].options.values' file1 file2

这里-s以数组形式返回文件,.[0]第一个文件和.[1]第二个文件也是如此。然后它只选择静态路径,并首先更新单个匹配字段。

如果您的对象的顺序或数量是可变的,或者如果替换仅适用于匹配的对象等,请更新问题。

答案2

我最喜欢的 JSON 和 YAML 合并工具是云杉。获取输出 JSON 的命令是:

spruce merge file1.json file2.json | spruce json

答案3

根据.name第一个 JSON 文件的数组中的键和.name第二个文件中的键在两个文件之间执行关系 JOIN 操作。

对于恰好具有相同.name值的元素,从第二个文件中选取元素,否则,从第一个文件中选取元素。

jq -s '[ JOIN(INDEX(.[1]; .name); .[0][]; .name; .[1] // .[0]) ]' file1 file2

.name以类似的方式,选择第一个文件中具有与第二个文件中相同值的键的数组的所有条目。使用第二个文件中的数据更新这些条目。

jq -s '[ .[1] as $u | .[0][] | select(.name == $u.name) |= $u ]' file1 file2

在这两种变体中(第一个命令末尾除外),.[0]是第一个文件(数组)中的数据,而.[1]是第二个文件(单个对象)中的数据。给定问题中显示的输入,这两个命令都会生成预期的输出。

相关内容