我想使用 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)
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
文件,每个文件插入一个伴随文件,但分离输出会很麻烦。