2016-04-04 15 views
3

私はいくつかのJSONを持っています。それは次のようになります。JQを使用してjq - 追加のJSONオブジェクトを新しい配列に抽出します

{ 
"Volumes": [ 
    { 
     "Attachments": [ 
      { 
       "VolumeId": "vol-11111111", 
       "State": "attached", 
       "DeleteOnTermination": false, 
       "Device": "/dev/sdz" 
      } 
     ], 
     "Tags": [ 
      { 
       "Value": "volume1", 
       "Key": "Name" 
      }, 
      { 
       "Value": "00:00", 
       "Key": "Start" 
      }, 
      { 
       "Value": "00:20", 
       "Key": "Finish" 
      }, 
      { 
       "Value": "2", 
       "Key": "Period" 
      } 
     ], 
     "VolumeId": "vol-11111111" 
    }, 
    { 
     "Attachments": [ 
      { 
       "VolumeId": "vol-22222222", 
       "State": "attached", 
       "DeleteOnTermination": false, 
       "Device": "/dev/sdz" 
      } 
     ], 
     "Tags": [ 
      { 
       "Value": "volume2", 
       "Key": "Name" 
      }, 
      { 
       "Value": "00:00", 
       "Key": "Start" 
      }, 
      { 
       "Value": "00:20", 
       "Key": "Finish" 
      }, 
      { 
       "Value": "2", 
       "Key": "Period" 
      } 
     ], 
     "VolumeId": "vol-22222222" 
    }, 
    { 
     "Attachments": [ 
      { 
       "VolumeId": "vol-333333333", 
       "State": "attached", 
       "DeleteOnTermination": false, 
       "Device": "/dev/sdz" 
      } 
     ], 
     "Tags": [ 
      { 
       "Value": "volume3", 
       "Key": "Name" 
      }, 
      { 
       "Value": "00:00", 
       "Key": "Start" 
      }, 
      { 
       "Value": "00:20", 
       "Key": "Finish" 
      }, 
      { 
       "Value": "2", 
       "Key": "Period" 
      } 
     ], 
     "VolumeId": "vol-33333333" 
    } 
] 
} 

、私は次のような情報を抽出することができる午前:

ボリュームID、終了、スタート、期間

使用JQコマンド

cat json | jq -r '[.Volumes[]|({VolumeId}+(.Tags|from_entries))|{VolumeId,Finish,Start,Period}]' 

[ 
    { 
    "VolumeId": "vol-11111111", 
    "Finish": "00:20", 
    "Start": "00:00", 
    "Period": "2" 
    }, 
    { 
    "VolumeId": "vol-22222222", 
    "Finish": "00:20", 
    "Start": "00:00", 
    "Period": "2" 
    }, 
    { 
    "VolumeId": "vol-33333333", 
    "Finish": "00:20", 
    "Start": "00:00", 
    "Period": "2" 
    } 
] 

これはすべて正常に動作します。しかし、私はさらに.Attachments.Deviceを抽出する必要があります。私はエラーを取得せずにこれを行う方法を見つけ出すことはできませんしかし

[ 
    { 
    "VolumeId": "vol-11111111", 
    "Finish": "00:20", 
    "Start": "00:00", 
    "Period": "2", 
    "DeviceId": "/dev/sdz" 
    }, 
    { 
    "VolumeId": "vol-22222222", 
    "Finish": "00:20", 
    "Start": "00:00", 
    "Period": "2", 
    "DeviceId": "/dev/sdz" 
    }, 
    { 
    "VolumeId": "vol-33333333", 
    "Finish": "00:20", 
    "Start": "00:00", 
    "Period": "2", 
    "DeviceId": "/dev/sdz" 
    } 
] 

:私は次のように各アレイの出力を探しています。私はエラーを取得するしかし

cat json | jq -r '[.Volumes[]|({VolumeId}+(.Attachments|from_entries)+(.Tags|from_entries))|{VolumeId,Finish,Start,Period,DeviceId}]' 

:私のための最も論理的なアプローチは、のような何かをするだろう

jq: error (at <stdin>:91): Cannot use null (null) as object key 

私は正しい致しておりません何、それは次のようになり修正する方法を考え出すすべてのヘルプ大いに感謝します。

おかげ

+0

JSONを修正してください。 ''添付ファイル ': "添付ファイル":は間違っています。 – peak

+0

@peak:apologies;固定 – user6127511

答えて

2

結局、問題は、それが動作しないときは、Attachmentsアレイ上from_entriesを使用していることです。 from_entriesは、キー/値ペアオブジェクトの配列をとり、それらの値を持つオブジェクトを作成します。ただし、キーと値のペアはありませんが、オブジェクトはありません。それらを組み合わせようとしているのであれば、addを使用してください。

また、DeviceIdというプロパティはありません。Deviceです。 Deviceプロパティを選択してDeviceIdとする場合は、正しい名前を指定する必要があります。

.Volumes | map(
    ({ VolumeId } + (.Attachments | add) + (.Tags | from_entries)) 
     | { VolumeId, Finish, Start, Period, DeviceId: .Device } 
) 
+0

あなたのお返事ありがとうございます。あなたが正しいです;それは「DeviceId」ではなく「Device」です。残念ながら、これは問題の根本的な原因ではありません。これは、エラーを引き起こす '+(。添付ファイル| from_entries) 'のように見えます。添付ファイル[]を引き出すために必要です。 '+(。タグ| from_entries)'はうまく動作します。 – user6127511

+0

ああ、そうです。今問題が何であるかはっきりしています。私は更新します。 –

関連する問題