如何编写 jq 脚本来提取可能显示为单例或列表的元素?

How to write jq script to extract elements that might appear as singleton or list?

如何编写一个 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 command-line 选项,例如

 jq --stream -f filter.jq input.json

本例中的jq过滤器为:

select(length==2 and 
       (.[0][-1] == "url") and
       last( .[0][:-1][]| strings ) == "creator")
| .[1]