2017-04-21 39 views
0

我有一種「JSON類型」(我不知道這是否是標準格式),我想用jq解析它。我已經嘗試了很多變體,但我無法讓它與jq一起工作。帶值的地圖標題

的「JSON」看起來是這樣的:

{ 
    "headers" : [ 
     "key1", 
     "key2", 
     "key3", 
    ], 
    "rows" : [ 
     [ 
     "value1", 
     "value2", 
     "value3" 
     ], 
     [ 
     "value1", 
     "value2", 
     "value3" 
     ], 
     [ 
     "value1", 
     "value2", 
     "value3" 
     ] 
    ], 
    "total_rows" : "3" 
} 

我想用頭部分作爲每一行按鍵。所以輸出應該是這樣的:

[ 
    "key1" : "value1", 
    "key2" : "value2", 
    "key3" : "value3" 
    ], 
    [ 
    "key1" : "value1", 
    "key2" : "value2", 
    "key3" : "value3" 
    ], 
    [ 
    "key1" : "value1", 
    "key2" : "value2", 
    "key3" : "value3" 
    ] 

回答

0
  1. 有一個在給定輸入一個多餘的逗號。以下假定它已被刪除。
  2. 請求的輸出不是有效的JSON,所以下面假定輸出的意圖是一個對象數組(如下所示)。其他輸出格式當然是可能的,包括原始發佈中給出的格式。
  3. 以下使用jq的「map」和「reduce」過濾器;如果你不熟悉這兩者中的任何一個,請參考jq文檔。

  4. 爲了清楚起見,下面的解決方案使用一個輔助函數值的數組鍵名的數組結合:

    def convolve(headers): 
        . as $in 
        | reduce range(0; length) as $i ({}; . + {(headers[$i]): $in[$i]}); 
    
  5. 隨着convolve/1定義,我們現在可以創建對象的數組:

    .headers as $h | .rows | map(convolve($h)) 
    
  6. 隨着文件上面JQ程序(比如program.jq)和JSON在一個文件名爲input.json,調用:

    jq -f program.jq input.json 
    

    生產:

    [ 
        { 
        "key1": "value1", 
        "key2": "value2", 
        "key3": "value3" 
        }, 
        { 
        "key1": "value1", 
        "key2": "value2", 
        "key3": "value3" 
        }, 
        { 
        "key1": "value1", 
        "key2": "value2", 
        "key3": "value3" 
        } 
    ] 
    
  7. 這裏是convolve自由降低清晰度;它假定的transpose/0的可用性,這是包含在JQ 1.5及以上:

    def convolve(headers): 
        [., headers] | transpose | map({(.[0]): .[1]}) | add; 
    
  8. 以下片段是功能上等同於在5以上所示:

    .headers as $h 
    | reduce .rows[] as $row ([]; . + [$row|convolve($h)]) 
    
+0

非常感謝! :) –

0

這裏是使用遞歸函數obj從鍵和值數組構建對象的解決方案。

def obj($keys; $values): 
    if $keys|length < 1 
    then {} 
    else {($keys[0]): $values[0]} + obj($keys[1:]; $values[1:]) 
    end 
; 

[ obj(.headers; .rows[]) ]