json 使用jq将对象数组转换为平面数组

k0pti3hp  于 2023-11-20  发布在  其他
关注(0)|答案(3)|浏览(148)

使用jq,我想将一个(嵌套的)对象数组扁平化为一个字符串数组。
例如,给定输入

{
  "message-id": 1,
  "result": {
    "info": {
      "id": 1,
      "name": "foobar",
      "route": [
        {
          "nodeid": 1,
          "nodename": "name-1"
        },
        {
          "nodeid": 2,
          "nodename": "name-2"
        }
      ]
    }
  }
}

字符串
我想把它交给

{
  "name": "foobar",
  "route": [
    "name-1",
    "name-2"
  ]
}


但是我正在努力使route节点变平--没有比

.result.info | { name: .name, route: .route }


这基本上保持了路由节点不变。这可能很简单,但目前我还不清楚。

azpvetkf

azpvetkf1#

下面是另一个变体,与您的尝试相同,加上一个修改route的步骤:

.result.info
| .route |= map(.nodename)
| {name, route}

字符串

chhqkbe1

chhqkbe12#

这里有一种方法你可以做到这一点,这是非常接近你的尝试。

.result.info
| {name} + {route: .route|map(.nodename)}

字符串
输出示例:

{
  "name": "foobar",
  "route": [
    "name-1",
    "name-2"
  ]
}


jqplay.org上试试。

tez616oj

tez616oj3#

目前还不完全清楚,是什么决定了你想要在哪个级别上收集(例如,你正在使用.result.info字面上),以及收集到哪些字段(或者为什么.id不会得到一个空数组),但这可能会帮助你沿着你的道路:
使用..可以递归地扫描文档树,strings过滤字符串,[…]将结果收集到一个数组中。此外,我使用map_values替换对象中所有字段的值。可以随意将其更改为您需要的字段。例如,您可以删除空数组或将一项数组更改为一个字符串本身。

.result.info | map_values([.. | strings])

个字符
Demo

相关问题