環境変数で2つのJSONをリンクする方法は?

環境変数で2つのJSONをリンクする方法は?

JSONテキストを含む環境変数があります。jqツールを使用してデータを追加したいです。既存のフィールドをすべて保持しながら、新しいフィールドを追加および/または上書きしたいと思います。アイデアは変数にパスを追加するのと同じですPATHJSON

理解できない場合でも、作成方法と例を見てください。私が書いた値について

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処理できることです。次に、配列のすべての要素を一緒に追加するフィルタに渡すだけです。jqadd

オブジェクトがに追加されると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機能使用:

inputinput [...]は、jq自体と同じソース(コマンドラインに名前が付けられたファイルstdinなど)から読み取られます。これら2つの組み込み関数は、jqの自己読み取り操作と一緒に相互にインターリーブできます。

関連情報