JSON转换-jq

q5iwbnjs  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(196)

我正在寻找从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"
    }
  ]
}

感谢您的帮助。此外,如果给出所应用的步骤/过滤器的解释,将对理解解决方案非常有帮助。
谢谢你!

tp5buhyn

tp5buhyn1#

这里有一个使用with_entries的简单方法,它允许你操作每个项的.key.value字段。这里,我们将.status.items数组中的项存储(迭代)在一个变量中,并将所有需要的字段拼凑在一起,无论是来自当前的.value(上下文)还是来自当前的$item(变量)。
第一个
Demo

相关问题