使用jq合并两个JSON对象

3

我有以下两个json文件,我正在尝试合并DEV对象。

json文件1:

{
  "ENV": {
    "DEV": {},
    "ST": {
      "middleware": [],
      "system": [],
      "application": [],
      "utility": []
    },
    "ESIT": {
      "middleware": [],
      "system": [],
      "application": [],
      "utility": []
    }
  }
}

json文件2:

{
  "ENV": {
    "DEV": {
      "middleware": [],
      "system": [],
      "application": [
         {
          "artefact": "abc",
          "domain": "df",
          "hostname": "sfa"
        },
        {
          "artefact": "awe",
          "domain": "csd",
          "hostname": "wer"
        }
      ],
      "utility": []
    }
  }
}

期望的 JSON 文件输出结果:

{
  "ENV": {
    "DEV": {
      "middleware": [],
      "system": [],
      "application": [
         {
          "artefact": "abc",
          "domain": "df",
          "hostname": "sfa",
        },
        {
          "artefact": "awe",
          "domain": "csd",
          "hostname": "wer",
        }
      ],
      "utility": []
    },
    "ST": {
      "middleware": [],
      "system": [],
      "application": [],
      "utility": []
    },
    "ESIT": {
      "middleware": [],
      "system": [],
      "application": [],
      "utility": []
    }
  }
}

我已经尝试过:

jq -s '.ENV["DEV"][] * .ENV["DEV"][]' jsonFile1.json jsonFile2.json

然而这会引发错误“无法使用字符串“ENV”索引数组”。如果删除jsonFile1中的“DEV”对象,可能会使合并过程更加容易。
2个回答

2

既然您想修改和输出第一个文件,那么让我们使用--slurpfile将第二个文件读入变量$other。然后,我们可以使用*=在原地合并第二个文件,这既合并又赋值:

$ jq --slurpfile other jsonFile2.json '.ENV.DEV *= $other[].ENV.DEV' jsonFile1.json
{
  "ENV": {
    "DEV": {
      "middleware": [],
      "system": [],
      "application": [
        {
          "artefact": "abc",
          "domain": "df",
          "hostname": "sfa"
        },
        {
          "artefact": "awe",
          "domain": "csd",
          "hostname": "wer"
        }
      ],
      "utility": []
    },
    "ST": {
      "middleware": [],
      "system": [],
      "application": [],
      "utility": []
    },
    "ESIT": {
      "middleware": [],
      "system": [],
      "application": [],
      "utility": []
    }
  }
}

您可以使用*=进行合并,或者使用=进行覆盖。

1
看起来你只是想在第一个文件中将.ENV.DEV设置为第二个文件中的.ENV.DEV。如果是这样,假设第二个文件的内容以某种方式存储在jq变量$f2中,那么你只需要一个赋值语句:
.ENV.DEV = $f2.ENV.DEV

所以,如果您不介意使用--argfile,可以编写以下内容:
jq --argfile f2 jsonFile2.json '.ENV.DEV=$f2.ENV.DEV' jsonFile1.json

至少这给出了预期的结果(除了在给定示例中的一些技术问题)。

由于--argfile在技术上已经被弃用,您可能希望改用--slurpfile,我可以想象您可能想使用+=,但除非您真的知道使用**=意味着什么,否则我建议避免使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接