jq - 将文件中的对象添加到 json 数组中

CLO*_*CLO 18 array json jq

我想使用 jq 将一个包含元素和值的数组添加到现有的 json 文件中。

我已经有一个文件(input.json)

{
  "id": 9,
  "version": 0,
  "lastUpdTs": 1532371267968,
  "name": "Training"
}
Run Code Online (Sandbox Code Playgroud)

我想将它添加到另一个组数组中到这个 json (orig.json)

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]
Run Code Online (Sandbox Code Playgroud)

最终结果应该是这样的

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [
      {
        "id": 9,
        "version": 0,
        "lastUpdTs": 1532371267968,
        "name": "Training"
      }
    ],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]
Run Code Online (Sandbox Code Playgroud)

我知道如何将元素添加到数组中,但不确定如何从文件中传入。

jq '.[].groups += [{"INPUT": "HERE"}]' ./orig.json
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 14

jq有一个标志,用于使用其--argjson标志提供实际的 JSON 内容。您需要做的是,将第一个 JSON 文件的内容存储在jq的上下文中的变量中,并在第二个 JSON 中更新它

jq --argjson groupInfo "$(<input.json)" '.[].groups += [$groupInfo]' orig.json
Run Code Online (Sandbox Code Playgroud)

该部分"$(<input.json)"是 shell 重定向构造,用于输出给定文件的内容,并将其参数--argjson存储在变量中groupInfo。现在您将它添加到groups实际过滤器部分的数组中。

换个角度来说,上面的解决方案就相当于这样做了

jq --argjson groupInfo '{"id": 9,"version": 0,"lastUpdTs": 1532371267968,"name": "Training" }' \
   '.[].groups += [$groupInfo]' orig.json
Run Code Online (Sandbox Code Playgroud)

  • 但请注意,“$(&lt;file)”是 ksh/bash/zsh 扩展,不能以其他方式移植。您可以使用“cat”代替。 (3认同)

Mic*_*mer 12

这是确切的情况下,input功能是:

input和输入 [...] 从与 jq 本身相同的来源(例如,标准输入,在命令行上命名的文件)读取。这两个内置函数,以及 jq 自己的读取动作,可以相互交错。

也就是说,jq从文件中读取一个对象/值并在其上执行管道,并且在任何input出现的地方读入下一个输入并用作函数的结果。

这意味着你可以这样做:

jq '.[].groups += [input]' orig.json input.json
Run Code Online (Sandbox Code Playgroud)

使用您已经编写的命令,加上input值。该input表达式将计算为从参数列表中的下一个文件读取的(第一个)对象,在本例中为input.json.

如果您要插入多个项目,则可以使用inputs具有相同含义的代替。它将从命令行平等地应用于单个或多个文件,并将[inputs]所有文件主体表示为一个数组。

也可以交错处理多个orig文件,每个文件插入一个伴随文件,但分离输出会很麻烦。