jq:将单个对象视为 1 元素数组

时间:2021-01-16 22:27:41

标签: json jq

我有几个要解析的 .json 文件(或者更确切地说,是由 xq/yq 预先解析的 .xml 文件)。不幸的是,我想要读取的元素 (.size) 可以位于一个额外的数组中(在这种情况下我会select其中一个)或只是一个对象,如下所示:

{
  "Obj1": {
    "size": "123"
  },
  "Obj2": [
    { "size": "3" },
    { "size": "5" }
  ]
}

Obj1 的情况下,查询 jq '.[].size' 产生“123”,正如预期的那样,但是 Obj2 失败,错误 Cannot index array with string 'size' 。 在 Obj2 的情况下,要获得单个 size 值(例如最大值),查询 jq '.[]|max.size 会产生“5”,正如预期的那样。但是这对于 Obj1 失败了,错误是对象 {"size":"123"} 无法迭代

是否有一种表达式可以将单个子对象 {"size":"123"} 视为具有一个元素的数组,或者允许我使用相同的查询处理这两种情况?

2 个答案:

答案 0 :(得分:1)

最简单的方法可能是检查输入是否为对象。假设输入必须是一个对象或一个对象数组,你可以做的比:

if type == "object" then .size else map(.size)|max end

就您而言,我猜您希望在此之前加上 .[]

.[] | if type == "object" then .size else map(.size)|max end

这会产生:

"123"
"5"

当然,如果您想要数字最大值,则必须进行适当的修改。

答案 1 :(得分:-1)

替代运算符 // 和可选运算符 ? 提供了此问题的简洁解决方案:

jq .[] | (max? // .) | .size
  • 如果 .[] 的结果是数组,则 max 返回数组的最大元素。
  • 否则,.[] 的结果不是数组,max 将失败,? 运算符将抑制错误,// 运算符将返回 { {1}} 代替。 在这两种情况下,都会返回一个包含 . 键的子对象。
相关问题