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

标签 json jq conditional-operator

如何编写一个 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/

相关文章:

javascript - 使用三元 if...else 运算符时出错

Python Pandas - Json 到 DataFrame

json - 质疑如何在Golang中将mongodb的命令转换为Bson

javascript - Backbone Collection 获取抛出 id 错误

json-rpc 响应 jq 过滤具有多个可能值

json - 将参数传递给 jq 过滤器

javascript - 如何使用相同的键聚合 2 个 json 数组的所有列

json - 如何使用JQ更新JSON并获取更新后的值

c - C 中的三元运算符和 Return

javascript - 如何使用 if...else 子句重写它?