2016-09-05 14 views
0

を使用してCSVに(配列と異なるデータ型の)複雑なJSONを変換しますは、私は次のようなJSONデータを持っているJQ 1.4

{ 
     "status": "ok", 
     "ok": true, 
     "data": "MFR-L", 
     "stores": [{ 
      "name": "KOLL", 
      "lat": 52.93128, 
      "lng": 6.962956, 
      "dist": 1, 
      "x10": 1.129, 
      "isOpen": true 
     }, 
     { 
      "name": "Takst", 
      "lat": 52.9523773, 
      "lng": 6.981644, 
      "dist": 1.3, 
      "x10": 1.809, 
      "isOpen": false 
     }] 
    } 

私はJQを使用してフラットファイルに変換しようとしているが、私は続けます特にファイルタイプ(「文字列でブール値をインデックスできません」など)のために、あらゆる種類の問題に遭遇します。

This post は、このように、私はこれまでの配列の内容を平らに支援してきました:

jq -r -s 'map(.stores | map({nm: .name, lt: .lat} | [.nm, .lt])) | add [] | @csv 

がどのように配列の内容にマップするために、階層内のコンテンツが高いを得ることができますか?

答えて

3

子オブジェクトとは別に親オブジェクトから必要な値を収集し、後で組み合わせることができます。

例えば、

$ jq -r '[.data] + (.stores[] | [.name, .lat, .lng, .dist]) | @csv' input.json 

利回り

"MFR-L","KOLL",52.93128,6.962956,1 
"MFR-L","Takst",52.9523773,6.981644,1.3 
+0

こんにちはJeff。これは "null(null)で反復できません"をスローします。 私は、jq 1.4を使用していることを指摘しておきます。 – Cos

+0

申し訳ありませんが、私はすでにタイトルでそれを述べていたようです。 – Cos

+0

こんにちは。心配しないで、あなたは絶対に正しいです、私は小さな間違いがありました。これは動作します、ありがとう! – Cos

0

あり説明JSON(例えばCSVに)「フラット化」される可能性がありますいくつかの方法がありますが、以下の2つのアプローチが対象となり得ます。ここでは(私は使いやすさの読み取りのための@csvの呼び出しを省略しました) $ jq '[.data, .stores[][]]' in.json [ "MFR-L", "KOLL", 52.93128, 6.962956, 1, 1.129, true, "Takst", 52.9523773, 6.981644, 1.3, 1.809, false ]

$ jq '.data as $data | .stores[] | [$data, .[]]' in.json [ "MFR-L", "KOLL", 52.93128, 6.962956, 1, 1.129, true ] [ "MFR-L", "Takst", 52.9523773, 6.981644, 1.3, 1.809, false ]

0

JQ変数と文字列の補間を使用する別のアプローチである:

.data as $data 
| .stores[] 
| "\($data),\(.name),\(.lat),\(.lng),\(.dist),\(.x10),\(.isOpen)" 

出力がでサンプルデータ:

"MFR-L,KOLL,52.93128,6.962956,1,1.129,true" 
"MFR-L,Takst,52.9523773,6.981644,1.3,1.809,false" 
関連する問題