要素と値の配列を、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
のコンテキストの変数に格納し、2番目のJSONでそれを更新することです
_jq --argjson groupInfo "$(<input.json)" '.[].groups += [$groupInfo]' orig.json
_
"$(<input.json)"
の部分は、指定されたファイルの内容を出力するシェルリダイレクト構成であり、_--argjson
_への引数とともに、変数groupInfo
に格納されます。次に、実際のフィルターパーツのgroups
配列に追加します。
別の言い方をすると、上記の解決策はこれを行うことと同等です
_jq --argjson groupInfo '{"id": 9,"version": 0,"lastUpdTs": 1532371267968,"name": "Training" }' \
'.[].groups += [$groupInfo]' orig.json
_
これは the input
function が当てはまるケースです:
input
および入力[...]は、jq自体と同じソース(例:stdin、コマンドラインで指定されたファイル)から読み取られます。これら2つのビルトイン、およびjq自身の読み取りアクションは、互いにインターリーブできます。
つまり、jq
はファイルからオブジェクト/値を読み取り、その上でパイプラインを実行します。どこでもinput
がnext入力が読み込まれ、関数の結果として使用されます。
それはあなたができることを意味します:
jq '.[].groups += [input]' orig.json input.json
既に書いたコマンドと、値としてinput
を使用します。 input
式は、引数リストの次のファイルから読み取られた(最初の)オブジェクトに評価されます。この場合、input.json
の内容全体です。
挿入するアイテムがmultipleある場合は、代わりにinputs
を同じ意味で使用できます。コマンドラインから単一または複数のファイルに等しく適用され、[inputs]
はすべてのファイル本体を配列として表します。
インターリーブして複数のorig
ファイルを処理し、それぞれに1つのコンパニオンファイルを挿入することもできますが、出力の分離は面倒です。