如何使用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
步骤解释
to_entries:把顶层的键值对(realtime、cmx)转换成包含key和value的对象数组,方便逐个处理每个模块。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处理——原数据有该字段则保留,没有则自动忽略,避免生成空字段。
from_entries:把处理完的键值对数组重新转换为JSON对象,得到最终的目标结构。
内容的提问来源于stack exchange,提问作者bravo
相关产品推荐
相关产品推荐

