如何编写一个jq查询,从一个可能显示为单例或列表的元素中提取属性?
例如,在下面的示例JSON字符串中从创建者中提取URL属性。
示例#1:
{
"@type": "example1",
"creator":{
"@type":"Organization",
"url": "https://www.ncei.noaa.gov/"
}
}
示例#2:
{
"@type": "example2",
"creator": [{
"@type":"Person",
"url": "https://www.example.com/homepage"
},
{
"url": "https://www.example.com/another"
}]
}
我尝试使用.creator
作为第一个,.creator[]
作为第二个,但这两个不兼容。有没有办法写这样才能适用于这两个例子?
一种非常简单的可能性就是测试.creator是否是一个数组:
if .creator|type == "array" then .creator[] else .creator end
| .url
在直截了当的另一端,如果(a)输入JSON文档是巨大的,并且(b)目标是列出作为.creator的直接子项出现的所有.url值,则另一种可能性是相关的。 ,无论键位于输入JSON文档中的哪个位置。调用将使用--stream命令行选项,例如
jq --stream -f filter.jq input.json
在这种情况下,jq过滤器是:
select(length==2 and
(.[0][-1] == "url") and
last( .[0][:-1][]| strings ) == "creator")
| .[1]