转换JSON并使其可通过jq读取

JavaScript Object Notation(JSON)是世界上最受欢迎的数据格式之一。它具有广泛的支持和简单的规范。使用许多编程语言,尤其是针对Web开发的语言,很容易使用。

但是手动检查JSON数据仍然很麻烦。尽管它是一种人类可读的文本格式,但JSON数据集可能包含大量数据。源代码并不总是以易于阅读的形式格式化JSON。

爪哇JQ工具允许用户格式,过滤和变换JSON数据。

什么是jq?

由于它是一个命令行工具,因此通常会通过在终端中键入命令来使用jq。这里还有一个出色的在线游乐场,我们将在下面详细介绍。

正常操作围绕过滤器以及将过滤器应用于某些输入JSON进行。您可以使用jq从多个项目中提取一个项目。或者,您可以从集合中的每个项目中删除某些字段,以简化数据。您甚至可以执行复杂的操作,以将输入转换为其他形式。

如何下载和安装jq

jq程序没有外部依赖性,这意味着它很容易上手。首先通过jq主页上的按钮下载适用于Linux,macOS或Windows的可执行二进制文件。下载程序后,可以直接从命令行运行它。为了方便起见,您可能希望将其重命名( mv jq-osx-amd64 jq ),并且可能需要使其重命名为可执行文件( chmod + x jq )。

通过从命令行不带参数执行jq来确认您可以运行jq:

 $ ./jq

您应该看到一些常规用法信息,以简单的单行摘要开头,如下所示:

 jq - commandline JSON processor [version 1.6]

如果您在使用上述方法时遇到困难,则有其他选择。 jq软件支持常见的软件包管理器,并且您随时可以同时试用在线沙箱。

基本的jQuery用法

标准用法是:

 jq [options] <jq filter> [file...]

因此,例如:

 $ jq '.' data.json

您还可以通过另一个命令来管道输入,如下所示:

 $ echo '{"name":"john"}' | jq '.'
{
"name": "john"
}

例如,当第一个命令是诸如curl的调用之类的东西时,它可以从Web服务获取JSON数据时,此功能最为有用。

这些示例中显示的过滤器是最简单的。 (一个句点) ,它以经过修饰的形式打印输入。这已经非常有用,但是jq的过滤器提供的功能远不止于此。

如何使用jq将基本过滤器应用于JSON

jq过滤器有点像CSS选择器或XPATH表达式。这是一个由较小部分组成的长表达式。一个完整的过滤器可能看起来很复杂,但是一旦您了解了基础知识,每个部分都应该可以理解。

处理对象

您可以使用.property语法获取对象属性的值:

 $ echo '{"name":"john"}' | jq '.name'
"john"

这可以链接到深层嵌套的结构:

 $ echo '{"name":{"first":"john","last":"smith"}}' | jq '.name.last'
"smith"

处理数组

最简单的数组操作通过其索引返回一个元素:

 $ echo '[1,2,3]' | jq '.[2]'
3

注意,与大多数编程语言一样,jq索引从位置0开始的数组。您还可以使用以下语法对子数组进行切片:

 $ echo '[1,2,3]' | jq '.[1:3]'
[
2,
3
]

在方括号内没有索引的情况下,jq将单个数组值转换为它自己的内容,作为多个值:

 $ echo '[1,2,3]' | jq '.[]'
1
2
3

这是将过滤器链接在一起的一种重要方法,我们将在后面介绍。

更多高级功能

您只能通过阅读jq手册全面了解jq的功能。实际上,jq对运算符,变量甚至用户定义的函数的支持使其能够像任何编程语言一样工作。

这些功能使复杂的使用成为可能。但是jq具有一些内置功能,例如函数和运算符,这些功能甚至可以使简单的任务受益。这是一个例子:

 $ echo '[2,4,8]' | jq 'add / length'
4.666666666666667

该过滤器将输入输入到加法长度函数中,将结果相除。在操作中,它计算数字数组的平均值。

除法运算符还可以对字符串进行操作,以基于分隔符对字符串进行拆分:

 $ echo '"Just testing"' | jq '. / " "'
[
"Just",
"testing"
]

select函数过滤一个数组,仅保留那些通过给定约束的项目:

 $ echo '[2,4,8]' | jq '.[] | select(. >= 3)'
4
8

请注意,这也是jq的管道运算符( | )的示例,类似于外壳的管道。它将左侧过滤器的结果作为输入输入到右侧过滤器。

使用数组时, map函数非常有用。它对数组的每个元素而不是整个数组本身执行操作:

 $ echo '[1,2,3]' | jq 'map(.+1)'
[
2,
3,
4
]

您经常将其与select结合使用,例如

$ echo '[2,4,8]' | jq 'map(select(. >= 3))'
[
4,
8
]

放在一起:一个实用的jq示例

由于jq处理通过管道传递给它的任何有效JSON,因此您可以从curl命令发送输出。这使您可以从URL提取JSON并立即在命令行上对其进行处理:

JSON Feed是RSS和Atom格式的JSON替代品。 NPR站点是一个支持JSON Feed的示例,但是很难从源代码查看它并包含大量数据:

立刻,您可以通过获取此数据并将其通过jq传递给您,从而轻松读取数据:

 $ curl -s https://feeds.npr.org/1019/feed.json | jq '.'

这是一个更完整的过滤器示例,该过滤器可获取网站在星期二发布的每个故事的ID,标题和日期。

 $ curl -s https://feeds.npr.org/1019/feed.json |
jq '.items | .[] |
select(
.date_published |
.[0:19] + "Z" |
fromdate |
strftime("%a") == "Tue"
) |
{id: .id, title:.title, date:.date_published}'

选择items属性后,此过滤器使用。[]遍历每个项目。筛选器的主要部分使用select函数来仅保留具有date_published值且其工作日( strftime(“%a”) )为Tue的帖子。 strftime函数需要格式非常特殊的日期,该日期由过滤器。[0:19] +“ Z”构造。

选择所需的项目后,最终的过滤器将为每个具有必填字段的对象建立一个对象。请注意,每次Feed更改时,结果都会有所不同。这是发布时的示例:

 {
"id": "959667930",
"title": "Deplatforming: Not A First Amendment Issue, But Still A Tough Call For Big Tech",
"date": "2021-01-26T17:00:00-05:00"
}
{
"id": "960679189",
"title": "My Pillow CEO Mike Lindell Permanently Suspended From Twitter",
"date": "2021-01-26T10:17:15-05:00"
}
{
"id": "960220477",
"title": "Is Your 401(k) Colluding To Make Cereal More Expensive?",
"date": "2021-01-26T06:31:24-05:00"
}

另请参阅: JSON Python解析:简单指南

如何使用jqplay在线处理JSON

如果要在下载前试用jq,jqplay是一个理想的起点。通过一个简单的界面,该站点允许您输入示例JSON和过滤器,然后查看结果。

它还允许您尝试一些不同的选项。其中包括–compact-output (删除空格)和–null-input (显示缺少输入的结果)。

该界面还包括一​​个非常有用的备忘单部分。这是前面的长示例的屏幕截图:

请注意,与该链接一样,您也可以通过URL共享示例。

使用jq读取和处理JSON数据

您可以从教程和手册中找到有关jq的完整信息,它们都可以在jq网站上找到。该程序本身通过–help选项提供了有限的帮助。

如果要执行基本的过滤器和转换或读取大量JSON,jq是一个有价值的工具。