JSONテキストを含む環境変数があります。jq
ツールを使用してデータを追加したいです。既存のフィールドをすべて保持しながら、新しいフィールドを追加および/または上書きしたいと思います。アイデアは変数にパスを追加するのと同じですPATH
がJSON
。
理解できない場合でも、作成方法と例を見てください。私が書いた値について
echo "{\"A\":\"Hello world\"}" | jq -r
それでは、このオブジェクトを他のオブジェクトとマージしたいとしましょう。
echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}"
答え1
新しい値が古い値を完全に置き換えるので、あなたの例は奇妙です。元の値には1つのキー「A」のみがあり、「マージ」される値には、元の値を置き換えるキー「A」の別の値が含まれています。
したがって、説明のために、これらの入力が異なる順序で行われているとします(「Hello world」が「Goodbye world」よりも優先され、「This is a joke」は同じままです)。
次のことができます。
( echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}" ; echo "{\"A\":\"Hello world\"}" ) | jq -s add
重要なのは、2つのjsonオブジェクトを順番に供給するので、配列にあるように-s
処理できることです。次に、配列のすべての要素を一緒に追加するフィルタに渡すだけです。jq
add
オブジェクトがに追加されるとjq
マージされ、追加操作の右側のオブジェクト(この場合は2つのオブジェクトの後者)に対して同じキーが検証されます。
ドキュメントを参照してください。
答え2
シェルトリックとプロセス置換を使用してJSON文字列を入力ファイルとして提供し、次に2つのファイルjq
の内容を連結できます。
jq -s '.[0] + .[1]' \
<(echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}") \
<(echo "{\"A\":\"Hello world\"}")
2 つのオブジェクト間の共通鍵であるため、A
最終結果に置き換えられます。
{
"A": "Hello world",
"B": "This was a joke"
}
あるいは、入力機能を使用することもできます。
printf '%s\n%s\n' "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}" \
"{\"A\":\"Hello world\"}" | \
jq '.+= input'
input
機能使用:
input
input [...]は、jq自体と同じソース(コマンドラインに名前が付けられたファイルstdinなど)から読み取られます。これら2つの組み込み関数は、jqの自己読み取り操作と一緒に相互にインターリーブできます。