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

use*_*331 3 json jq

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

"values": [
  "/businessclass/articles/money.page",
  "/businessclass/articles/1.page",
  "/businessclass/articles/2.page"
],
Run Code Online (Sandbox Code Playgroud)

输出应该是 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": ""
  }
]
Run Code Online (Sandbox Code Playgroud)

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": ""
}
Run Code Online (Sandbox Code Playgroud)

预期产出

[
  {
    "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": ""
  }
]
Run Code Online (Sandbox Code Playgroud)

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

dir*_*rkt 6

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

jq -s . file1 file2
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

jq -s '.[0][1].criteria[0].options.values=.[1].criteria[0].options.values' file1 file2
Run Code Online (Sandbox Code Playgroud)

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

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