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

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

答え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機能使用:

inputinput [...]は、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

関連情報