2017-09-15 68 views
1

如何只輸出下面的duration值?如何用jq在json中搜索?

如果我搜索jq -r ".media.duration"那麼我得到nil

$ cat test.json | jq -r ".episodes[1:]" 
[ 
    { 
    "uniqueHash": "a2dc48cd0f9", 
    "startOffset": "{0}", 
    "media": { 
     "720p": { 
     "extension": "mp4", 
     "filesize": "1702", 
     "duration": "00:51:55", 
     }, 
    } 
    }, 
    { 
    "uniqueHash": "a2d0f9", 
    "startOffset": "{0}", 
    "media": { 
     "720p": { 
     "extension": "mp4", 
     "filesize": "12602", 
     "duration": "00:51:55", 
     }, 
    } 
    }, 
] 

回答

2

使用map()

$ cat test.json | jq -r '.episodes[1:] | map(.media["720p"].duration)' 
[ 
    "00:51:55", 
    "00:51:55" 
] 

因爲.episodes[1:]給你一個列表,你需要通過它。 map(<selector>)就是你想要的。

或者,你可以使用扁平的.[]名單:

$ cat test.json | jq -r ".episodes[1:] | .[] | .media[\"720p\"].duration" 
00:51:55 
00:51:55 

上述方案假定你總是有720p。這可能並非總是如此,所以你可以使用to_entries讓所有決議:

$ cat test.json | jq -r ".episodes[1:] | map(.media|to_entries[]|.value.duration)" 
[ 
    "00:51:55", 
    "00:51:55" 
] 
+0

對於第二種解決方案,我得到'jq:error:syntax error,意外的INVALID_CHARACTER(Unix shell引用問題?)在,第1行:'添加'[「720p \」]''時。運行''.episodes [1:] |。[] | .media「'。 –

+0

@JasmineLognnes你對整個表達式使用雙引號嗎?你必須使用'「... [\」720p \「] ...」'(雙引號+轉義內部雙引號)或''... [「720p」] ...''(單引號) 。 – bfontaine

2

你仍然需要到那一點;你還沒有做jq相當於cd或任何東西。您需要通過添加另一組括號來平坦化由episodes[1:]返回的數組。此外,您跳過了分辨率級別("720p")。把這一切放在一起,這應該工作。它將每行輸出一個持續時間值,未加引號的:你不能使用點語法上720p(* media.720p.duration

jq -r '.episodes[1:][].media["720p"].duration' 

注意,因爲有一個數字,關鍵開始。

請注意,您的JSON片段在技術上無效;嚴格的JSON不允許在列表末尾使用逗號。我糾正了包裹的結構以匹配您的查詢:

{ 
    "episodes": [ 
    {}, 
    { 
     "uniqueHash": "a2dc48cd0f9", 
     "startOffset": "{0}", 
     "media": { 
     "720p": { 
      "extension": "mp4", 
      "filesize": "1702", 
      "duration": "00:51:55" 
     } 
     } 
    }, 
    { 
     "uniqueHash": "a2d0f9", 
     "startOffset": "{0}", 
     "media": { 
     "720p": { 
      "extension": "mp4", 
      "filesize": "12602", 
      "duration": "00:51:55" 
     } 
     } 
    } 
    ] 
} 

運行在上面的產量jq -r '.episodes[1:][]|.media["720p"].duration'輸出:

00:51:55 
00:51:55 
+0

'episodes [1:]'是一個列表,所以'episodes [1:]。media'將不起作用。改用'map()'來代替我的答案。 – bfontaine

+0

我得到'jq:錯誤(在:1):無法用字符串「media」索引數組。 – bfontaine

+0

啊,你說的對,我額外括號。你需要'episodes [1:] []。media'。 –

1

如果你只是想拉你的JSON樹中的任意duration值,你可能只是重複並試圖拉duration丟棄空結果。

.. | objects.duration? // empty 

要更加明確,只有拉duration值,你可以分析路徑的值,僅選擇duration值。

getpath(leaf_paths | select(.[-1] == "duration")) 
1

以下是使用tostream的變體。如果(略微校正的)樣本數據是在data.json則命令

​​

產生

00:51:55 
00:51:55 

這應在原始JSON數據以及所述.media.duration樣本數據子樹工作。