web-dev-qa-db-ja.com

jq-オブジェクトをファイルからjson配列に追加する

要素と値の配列を、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
9
CLO

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
_
9
Inian

これは the input function が当てはまるケースです:

inputおよび入力[...]は、jq自体と同じソース(例:stdin、コマンドラインで指定されたファイル)から読み取られます。これら2つのビルトイン、およびjq自身の読み取りアクションは、互いにインターリーブできます。

つまり、jqはファイルからオブジェクト/値を読み取り、その上でパイプラインを実行します。どこでもinputnext入力が読み込まれ、関数の結果として使用されます。

それはあなたができることを意味します:

jq '.[].groups += [input]' orig.json input.json

既に書いたコマンドと、値としてinputを使用します。 input式は、引数リストの次のファイルから読み取られた(最初の)オブジェクトに評価されます。この場合、input.jsonの内容全体です。

挿入するアイテムがmultipleある場合は、代わりにinputsを同じ意味で使用できます。コマンドラインから単一または複数のファイルに等しく適用され、[inputs]はすべてのファイル本体を配列として表します。

インターリーブして複数のorigファイルを処理し、それぞれに1つのコンパニオンファイルを挿入することもできますが、出力の分離は面倒です。

7
Michael Homer