Jq ---入れ子になったjsonをcsvに変換する

Jq ---入れ子になったjsonをcsvに変換する

以下のサンプルJSONがあります。

{
  "data": [
    {
      "name": "city",
      "LIST": {
        "ID": [
          {
            "value": "ny",
            "name": "US"
          },
          {
            "value": "lon",
            "name": "GB"
          },
          {
            "value": "Toronto",
            "name": "CA"
          }
        ]
      }
    },
    {
      "name": "city1"
    }
  ]
}

次の値を取得したい

city,ny

city1,

私はname = "US"の値だけが欲しいですjq

配列の各要素の最大値は1 name= "US"ですdata。 ="US"がない場合はname空またはNULLになります。上記の例では、2番目のレコードに= "US"がない場合、出力はまたはにnameなります。city1,blankcity1,

答え1

data要素が次のようになるとします。最大.LIST.ID配列の1つの要素nameは次のとおりですUS

jq -r <file '.data[] |
  [ .name, (.LIST.ID[] | select(.name == "US").value)? // null ] |
  @csv'

できること:

  1. 配列のすべての要素を返す(保持)しますdata
  2. の各要素に対して、以下をdata含む2要素配列(CSV書式設定に必要)を作成します。
    1. name各要素dataの属性値
    2. などの配列要素のプロパティ値value(そうでない場合は、inを使用して完全に空のフィールドではなくCSV出力から二重引用符で囲まれたフィールドを取得できます)が完全に欠落しています。エラーは発生しません。.LIST.IDnameUSnull""null?.LIST.ID
  3. 結果配列のリストをCSVデータとしてレンダリングします。

答え2

本質的に同じフレイサンの答え.LIST.IDしかし、配列の要素をオブジェクトに変換できるという事実を活用します。ここでname値はキー、value値は対応する値です。

jq -r '.data[] | [.name, (.LIST.ID | from_entries? | .US) // "blank"] | @csv' file

与えられたサンプルデータを入力として使用すると、次のヘッダーレスCSVデータが生成されます。

"city","ny"
"city1","blank"

データ内の2番目のフィールドが利用できない場合は、// "blank"式でに変更して空のフィールドを作成します。// nulljq

関連情報