我想使用 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