You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq工具实现API返回JSON的指定格式转换?

解决API JSON响应的jq格式转换问题

示例输入JSON

{
    "realtime": {
        "status": {
            "name": "realtime",
            "link": {
                "state": "RUNNING",
                "link_id": "09-1"
            },
            "items": [
                {
                    "id": 0,
                    "state": "RUNNING",
                    "link_id": "09-1"
                },
                {
                    "id": 1,
                    "state": "STOPPED",
                    "link_id": "09-1"
                }
            ],
            "doc": "origin"
        }
    },
    "cmx": {
        "status": {
            "name": "cmx",
            "link": {
                "state": "RUNNING",
                "link_id": "09-1"
            },
            "items": [
                {
                    "id": 0,
                    "state": "FAILED",
                    "link_id": "09-1",
                    "log": "ErrorMsg"
                }
            ],
            "doc": "origin"
        }
    }
}

期望输出JSON

{
    "realtime.0": {
        "name": "realtime",
        "state": "RUNNING",
        "url": "/link/realtime/",
        "item": 0,
        "item_state": "RUNNING",
        "item_url": "/links/realtime/items/0/"
    },
    "realtime.1": {
        "name": "realtime",
        "state": "RUNNING",
        "url": "/link/realtime/",
        "item": 1,
        "item_state": "STOPPED",
        "item_url": "/links/realtime/items/1/"
    },
    "cmx.0": {
        "name": "cmx",
        "state": "RUNNING",
        "url": "/links/cmx/",
        "item": 0,
        "item_state": "FAILED",
        "item_url": "/links/cmx/items/0/",
        "log": "ErrorMsg"
    }
}

尝试的jq命令及结果

尝试的命令:

.[]|.status | .name as $name |.link.state as $state| .items[] | {$name, $state,items:[.]}| del(.items[].link_id)

得到的结果:

{
  "name": "realtime",
  "state": "RUNNING",
  "items": [
    {
      "id": 0,
      "state": "RUNNING"
    }
  ]
}
{
  "name": "realtime",
  "state": "RUNNING",
  "items": [
    {
      "id": 1,
      "state": "STOPPED"
    }
  ]
}
{
  "name": "cms",
  "state": "RUNNING",
  "items": [
    {
      "id": 0,
      "state": "FAILED",
      "log": "Error"
    }
  ]
}

正确的jq解决方案

最终命令

to_entries | map(
    .value.status |
    .name as $name |
    .link.state as $state |
    .items[] |
    .id as $item_id |
    {
        key: "\($name).\($item_id)",
        value: {
            name: $name,
            state: $state,
            url: "/links/\($name)/",
            item: $item_id,
            item_state: .state,
            item_url: "/links/\($name)/items/\($item_id)/",
            log: .log // empty
        }
    }
) | from_entries

步骤解释

  1. to_entries:把顶层的键值对(realtime、cmx)转换成包含key和value的对象数组,方便逐个处理每个模块。
  2. map(...):遍历每个转换后的对象,对模块内数据做处理:
    • .value.status:提取每个模块下的status核心数据。
    • 变量存储:把name、link.state、当前item的id存为$name、$state、$item_id,后续复用减少重复解析。
    • 构造目标键值:
      • key:拼接成模块名.项目ID格式,对应期望输出的顶层键。
      • value:按期望结构组装字段,其中url和item_url按固定规则生成,item_state提取自当前item的state,log用// empty处理——原数据有该字段则保留,没有则自动忽略,避免生成空字段。
  3. from_entries:把处理完的键值对数组重新转换为JSON对象,得到最终的目标结构。

内容的提问来源于stack exchange,提问作者bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:25:39