2017-07-14 69 views
0

所以我試圖用jq取出一些JSON。如何混合出jq的json級別

下面是一個例子:

{  
    "limit":10, 
    "offset":20, 
    "values": [ 
     { 
      "id": "abcd" 
      "type": "file" 
      "users": { 
      "total": 2, 
      "profiles": [ 
       { 
        "first_name": "John", 
        "last_name": "Smith" 
       }, 
       { 
        "first_name": "Sue", 
        "last_name": "Johnson" 
       } 
      ] 
      } 
     }, 
     { 
      "id": "efgh" 
      "type": "folder" 
      "users": { 
      "total": 1, 
      "profiles": [ 
       { 
        "first_name": "Steve", 
        "last_name": "Gold" 
       } 
      ] 
      } 
     }, 
    ] 
} 

我很想得到我的結果

limit:10 
offset:20 
id:abcd, type:file, [users.total:2, users.profiles.first_name: [John, Sue], users.profiles.last_name: [Smith, Johnson]], 
id:efgh, type:folder, [users.total:1, users.profiles.first_name: [Steve], users.profiles.last_name: [Gold]], 

下面我知道我能管這JQ,但我不知道怎麼辦。我可以很容易地獲得數組中的東西,但我似乎無法弄清楚如何去做,並添加到頂級元素中。所以這是'極限'和'抵消',這讓我很滿意。

我能得到的東西

jq ".values[] | .users.total, .users[].first_name, .users[].last_name" 

但我似乎無法弄清楚如何在限制添加和偏移。

+0

您在JSON中缺少一堆逗號。 – Barmar

+0

你使用哪個版本的'jq'?我的1.5.1由於缺少和額外的逗號而無法解析這個JSON,並且在解決這個問題之後,它以「無法用字符串索引號」first_name「」 –

+0

應該是'.users.profiles []。first_name' – Barmar

回答

2

您可以在頂級使用逗號來獲得這些字段。使用圓括號將從.values獲取所有內容的表達式分組。

jq '.limit, .offset, (.values[] | .id, .type, .users.total, .users.profiles[].first_name, .users.profiles[].last_name)' 

DEMO

+0

就是這樣。我有沒有辦法讓jq也爲這些值打印JSON鍵? – jasonmclose

+0

也許你可以用'to_entries'功能來做些什麼。它將對象'{「k1」:「v1」,「k2」:「v2」}'轉換爲數組''{「key」:「k1」,「value」:「v1」},{「key」 :「k2」,「value」:「v2」}]'。然後您可以循環顯示這些鍵和值。 – Barmar

0

所以這是 '限價' 和 '偏移' 被扔我適合。

它看起來像to_entries可能是你在找什麼。舉個例子:

to_entries[] 
| select(.value | type != "array") 
| [.key, .value] 
| join(": ") 

有了您的JSON,這將產生您有困難的線條,在密鑰名稱中的任何明確提到:

limit: 10 
offset: 20 

然後,您可以(例如)使用逗號運算符(,)生成你想要的其他行。