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
コンテキストの変数に保存し、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
答え2
これは正確な状況です。input
機能使用:
input
input [...]は、jq自体と同じソース(コマンドラインに名前が付けられたファイルstdinなど)から読み取られます。これら2つの組み込み関数と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