我正在寻找从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/"x
},
"cmx.0": {
"name": "cmx",
"state": "RUNNING",
"url": "/links/cmx/",
"item": 0,
"item_state": "FAILED",
"item_url": "/links/cmx/items/0/",
"log": "ErrorMsg"
}
}
我得到的最好的命令是:.[]|.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"
}
]
}
感谢您的帮助。此外,如果给出所应用的步骤/过滤器的解释,将对理解解决方案非常有帮助。
谢谢你!
1条答案
按热度按时间tp5buhyn1#
这里有一个使用
with_entries
的简单方法,它允许你操作每个项的.key
和.value
字段。这里,我们将.status.items
数组中的项存储(迭代)在一个变量中,并将所有需要的字段拼凑在一起,无论是来自当前的.value
(上下文)还是来自当前的$item
(变量)。第一个
Demo