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

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

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

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

{
  "id": 9,
  "version": 0,
  "lastUpdTs": 1532371267968,
  "name": "Training"
}

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

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]

最终结果应该是这样的

[
  {
    "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"
  }
]

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

jq '.[].groups += [{"INPUT": "HERE"}]' ./orig.json

答案1

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

jq --argjson groupInfo "$(<input.json)" '.[].groups += [$groupInfo]' orig.json

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

换句话说,上面的解决方案相当于这样做

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

答案2

这就是确切的情况功能input用于:

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

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

这意味着你可以这样做:

jq '.[].groups += [input]' orig.json input.json

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

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

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

答案3

新版本jq支持slurpfile

这实现了您正在寻找的结果:jq '.[].groups += $inputs' orig.json --slurpfile inputs input.json

在jq 1.6中测试

答案4

使用点作为占位符

echo '{
  "id": 9,
  "version": 0,
  "lastUpdTs": 1532371267968,
  "name": "Training"
}' | jq '[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [.],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]'

输出:

[
  {
    "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"
  }
]
jq --version
jq-1.6

相关内容