【问题标题】:JQ to flatten an array into an objectJQ 将数组展平为对象
【发布时间】:2020-10-09 23:32:17
【问题描述】:

我在本应简单的任务中使用 JQ 时遇到了麻烦。

这是一个示例 JSON:

[
    {
        "title": "channel 1",
        "url": "rtsp://thelink"
    },
    {
        "title": "channel UFO",
        "url": "rtsp://thatlink"
    },
    {
        "title": "channel oreo",
        "url": "rtsp://thatotherlink"
    },
    {
        "title": "channel blabla",
        "url": "rtsp://yetanotherlink"
    },
    {
        "title": "channel potato",
        "url": "rtsp://anotherlinkwhatnow"
    }
]

我正在尝试将阵列扁平化为更大的阵列,以便稍后在低功耗设备上进行解析。它应该是这样的:

{
    "channel 1": "rtsp://thelink",
    "channel UFO": "rtsp://thatlink",
    "channel oreo": "rtsp://thatotherlink",
    "channel blabla": "rtsp://yetanotherlink",
    "channel potato": "rtsp://anotherlinkwhatnow"
}

我什至不会假装理解 JSON 工作原理的完整结构,但是随着这类小问题的解决,我离理解更近了。

任何帮助表示赞赏。 FWIW,精通 PHP,我可以非常简单地使用 foreach 进行迭代,并以每个值作为键重新创建新的。但我真的希望更好地了解 JQ 的工作原理(不是因为缺乏尝试或阅读手册!)。

【问题讨论】:

    标签: arrays json jq


    【解决方案1】:

    使用map 根据您感兴趣的字段将对象数组映射到键值对,然后使用add 将这些对合并为一个对象。

    $ jq 'map({(.title): .url}) | add' test.json
    {
      "channel 1": "rtsp://thelink",
      "channel UFO": "rtsp://thatlink",
      "channel oreo": "rtsp://thatotherlink",
      "channel blabla": "rtsp://yetanotherlink",
      "channel potato": "rtsp://anotherlinkwhatnow"
    }
    

    【讨论】:

    • 在概念上有效,但频道名称并不都遵循数字增量,您将如何实际使用标题中的键?
    • 好吧,鉴于您的示例,这将不起作用,因为键必须是唯一的,因此您的结果输出将只有两个键,channel 1channel 2
    • 我的错误刚刚意识到错误,谢谢。编辑问题以更好地反映示例
    • jq 'map({(.title): .url}) | add' 那么呢?
    • 因为新规范中不需要索引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2023-03-20
    • 2021-11-06
    • 2023-01-28
    • 2015-09-17
    • 2021-12-25
    相关资源
    最近更新 更多