【问题标题】:How to mix levels of json coming out of jq如何混合来自 jq 的 json 级别
【发布时间】:2017-07-14 20:28:09
【问题描述】:

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

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

【问题讨论】:

  • 您的 JSON 中缺少一堆逗号。
  • 您使用的是哪个版本的jq?由于缺少逗号和额外的逗号,我的 1.5.1 无法解析此 JSON,在修复该问题后,它失败并显示“无法使用字符串“first_name”索引编号”
  • 应该是.users.profiles[].first_name
  • 对不起。我只是发布了一些即时制作的内容,并尝试在 stackoverflow 中对其进行格式化,使其看起来不错让我忘记了逗号。

标签: json linux bash jq


【解决方案1】:

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

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

DEMO

【讨论】:

  • 就是这样。有没有办法让 jq 也打印每个值的 JSON 键?
  • 也许你可以用to_entries函数做点什么。它将对象{ "k1": "v1", "k2": "v2" } 转换为数组[{"key": "k1", "value": "v1"}, {"key": "k2", "value": "v2"}]。然后,您可以遍历它以打印键和值。
【解决方案2】:

所以是“限制”和“偏移”让我大吃一惊。

看起来to_entries 可能就是您要查找的内容。例如:

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

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

limit: 10
offset: 20

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多