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

问题描述 投票:3回答:1

如何编写一个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[]作为第二个,但这两个不兼容。有没有办法写这样才能适用于这两个例子?

json jq conditional-operator
1个回答
2
投票

一种非常简单的可能性就是测试.creator是否是一个数组:

if .creator|type == "array" then .creator[] else .creator end
| .url

Streaming parser

在直截了当的另一端,如果(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]
© www.soinside.com 2019 - 2024. All rights reserved.