如何混合来自jq的json级别

时间:2017-07-14 20:28:09

标签: json linux bash jq

所以我试图用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"

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

2 个答案:

答案 0 :(得分:2)

您可以在顶层使用逗号来获取这些字段。使用括号对从.values获取所有内容的表达式进行分组。

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

DEMO

答案 1 :(得分:0)

  

所以它的限制'和'抵消'这让我很适合。

看起来to_entries可能是您正在寻找的内容。例如,考虑一下:

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

使用您的JSON,这会产生您遇到困难的行,而不会明确提及键名:

limit: 10
offset: 20

然后你可以(例如)使用逗号运算符(,)来生成你想要的其他行。