【问题标题】:jq returns nothing if nested array is empty如果嵌套数组为空,jq 不返回任何内容
【发布时间】:2018-07-03 18:27:30
【问题描述】:

这里填充了数组 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"
  }
]

您可以在此处看到缺少的键被设置为 null。

$ 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"],}]'
[]
$ 

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

【问题讨论】:

  • 1.请遵循minimal reproducible example 准则。目前尚不清楚问题中的“this”是什么。 2. .subThings[]["subThing-2"] 显然不是你的意思。也许你的意思是.subThings["subThing-2"]

标签: json linux jq


【解决方案1】:

您正在尝试根据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) })

【讨论】:

    【解决方案2】:

    我仍然不知道我得到的 json 是否不好,或者这是否是 jq 中的错误。我发现这个解决方案使用 sed 使数组不为空。

    $ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[]}]' | sed 's/\[ *\]/[null]/g' | jq '[.[] | {"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"],}]'
    [
      {
        "thing-1": "meta1",
        "thing-5": null,
        "subThing-2": null
      }
    ]
    $
    

    【讨论】:

    • [][] 评估为 jq 中的空流是一个特性,而不是一个错误。
    猜你喜欢
    • 2023-01-23
    • 2018-10-24
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多