首页 > 解决方案 > 在 Bash 中解析 Json 嵌套对象

问题描述

我正在访问一个返回带有嵌套对象的 JSON 的 API,如下所示:

{
  "9273": {
    "status": "ok",
    "tag": "group-8",
    "name": "London"
  },
  "4029": {
    "status": "unknown",
    "tag": "group-12",
    "name": "Tokyo"
  },
  "6322": {
    "status": "ok",
    "tag": "group-12",
    "name": "Singapore"
  },
  "1038": {
    "status": "unknown",
    "tag": "group-19",
    "name": "Melbourne"
  },
  "2938": {
    "status": "ok",
    "tag": "group-12",
    "name": "New York"
  }
}

我正在尝试在 Bash 脚本中使用jq,等解析 JSON regex,在(ok) 和(最高组带有 'ok') 上对其进行过滤,然后展平匹配的对象以获得多行排序的字符串值他们连同一个静态前缀(例如城市)。sedstatustagname

所需的输出如下:

City: New York
City: Singapore

我将不胜感激任何帮助解决这个问题。

标签: jsonbashsedjq

解决方案


使用您的数据并使用 -r 命令行选项,以下程序会生成如下所示的输出:

[.[]]
| map(select(.status == "ok"))
| (max_by( .tag | sub("group-";"") | tonumber) | .tag) as $mx
| .[]
| select(.tag==$mx)
| "City: \(.name)"

输出:

City: Singapore
City: New York

如果您希望按字母顺序列出城市,则可以将适当的sort_by过滤器添加到 jq 管道。


推荐阅读