我有几个要解析的 .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"}
视为具有一个元素的数组,或者允许我使用相同的查询处理这两种情况?
答案 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}} 代替。
在这两种情况下,都会返回一个包含 .
键的子对象。