如何编写一个 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) 目标是列出作为直接子项出现的所有 .url 值,则还有另一种可能性.creator,无论键位于输入 JSON 文档中的什么位置。调用将使用 --stream 命令行选项,例如
jq --stream -f filter.jq input.json
本例中的 jq 过滤器是:
select(length==2 and
(.[0][-1] == "url") and
last( .[0][:-1][]| strings ) == "creator")
| .[1]
关于json - 如何编写 jq 脚本来提取可能显示为单例或列表的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49064828/