我想使用 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
jq
有一个标志,用于用它的标志提供实际的 JSON 内容--argjson
。您需要做的是,将第一个 JSON 文件的内容存储在jq
' 上下文中的变量中,并在第二个 JSON 中更新它该部分
"$(<input.json)"
是shell重定向构造,用于输出给定文件的内容,并将其参数--argjson
存储在变量中groupInfo
。现在您将它添加到groups
实际过滤器部分的数组中。换句话说,上面的解决方案相当于这样做
这是该函数
input
的确切情况:也就是说,
jq
从文件中读取一个对象/值并在其上执行管道,并且下一个input
输入出现的任何地方都被读入并用作函数的结果。这意味着你可以这样做:
与您已经编写的命令完全相同,加上
input
作为值。该input
表达式将评估从参数列表中的下一个文件读取的(第一个)对象,在这种情况下是input.json
.如果您要插入多个项目,则可以使用
inputs
具有相同含义的替代项。它将从命令行平等地应用于单个或多个文件,并将[inputs]
所有文件主体表示为一个数组。也可以交错处理多个
orig
文件,每个文件都插入一个伴随文件,但分离输出会很麻烦。新版本的
jq
支持slurpfile
这实现了您正在寻找的结果:
jq '.[].groups += $inputs' orig.json --slurpfile inputs input.json
在 jq 1.6 中测试
使用点作为占位符
输出: