首页 > 解决方案 > 如果嵌套数组为空,jq 不返回任何内容

问题描述

这里填充了数组 subThings

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[{"subThing-1" : "subMeta1","subThing-2" : "subMeta2","subThing-n" : "subMetan"}]}]' | jq '.'
[
  {
    "subThings": [
      {
        "subThing-n": "subMetan",
        "subThing-2": "subMeta2",
        "subThing-1": "subMeta1"
      }
    ],
    "thing-n": "metan",
    "thing-2": "meta2",
    "thing-1": "meta1"
  }
]

你可以在这里看到缺少的键被设置为空。

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[{"subThing-1" : "subMeta1","subThing-2" : "subMeta2","subThing-n" : "subMetan"}]}]' |
 jq '[.[] | {"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"],}]'
[
  {
    "subThing-2": "subMeta2",
    "thing-5": null,
    "thing-1": "meta1"
  }
]

这里数组 subThings 是空的

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[]}]' | jq '.'
[
  {
    "subThings": [],
    "thing-n": "metan",
    "thing-2": "meta2",
    "thing-1": "meta1"
  }
]

而不是 subThing-2 的空值,它会清除所有数据。

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[]}]' |
  jq '[.[] | {"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"],}]'
[]
$ 

为什么?
有没有其他方法可以在没有空数组擦除所有内容的情况下获取数据?

标签: jsonlinuxjq

解决方案


您正在尝试根据对象的存在来生成subThings对象。这实际上是.subThings[]{"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"]}.

您需要subThings单独评估并替换为null如果没有,否则它将只是empty什么都不会产生(这就是您在此处看到的)。

map({ "thing-1", "thing-5", "subThing-2": (.subThings[]."subThing-2" // null) })

推荐阅读