jq是一种轻量级且专门用于处理JSON数据的命令行工具。对于初学者来说,掌握jq的用法可以让你更高效地处理JSON数据,并且可以帮助你快速解决一些数据处理问题。本文将为你介绍jq的基础语法和重要的操作。如果你想成为一个合格的前端或后端开发人员,那么本篇文章是值得阅读的。
一. jq是什么?
jq是一种轻量级的命令行工具,它主要用于处理JSON数据。它使用一些简洁的命令来过滤和重组JSON数据,使操作JSON数据变得更加简单、高效。它基于UNIX命令行管道的原则,可以跨平台运行,不限于特定操作系统。这就意味着你可以在Windows、MacOS、Linux等平台上使用它。
二. 安装jq
在使用jq之前,你需要先将其安装到本地电脑上。如果你是MacOS用户,可以简单使用以下命令进行安装:
brew install jq
如果你使用的是Debian或Ubuntu发行版,可以使用以下命令进行安装:
sudo apt-get install jq
如果你使用的是其他发行版或操作系统,可以访问jq官方网站 https://stedolan.github.io/jq/ 下载相应的包进行安装。
安装完成后,你可以通过以下命令在命令行界面中进行测试:
jq --help
如果没问题,你应该看到如下输出:
Usage: jq [options] filter [files...]
默认情况下,jq从标准输入读取JSON数据,将过滤结果输出到标准输出。
三. jq的基本语法
在学习使用jq之前,先来了解 jq基本语法中的一些重要概念: 筛选器(filter)、输入数据(input data)和输出格式(output format)。
1. 筛选器(filter)
jq的一个最基本的功能就是实现数据的筛选。jq的筛选器可以对JSON数据进行过滤、选择和转换操作。具体来说,它们主要用于从输入的JSON数据中筛选出特定的对象、属性、元素等。
下面是一些jq筛选器的例子:
例(1):
把JSON数据中的firstName和lastName筛选出来,进行格式化输出:
cat people.json | jq '.[] | {firstName, lastName}'
这将输出查询结果,人们的firstName和lastName被重新构造成一个新的JSON格式。
例(2):
把JSON数据中的firstName并且lastName筛选出来:
cat people.json | jq '.[] | .firstName+.lastName'
这个例子定义了一个筛选器,把JSON数组中的所有firstName和lastName组合在一起,并在它们中间添加了一个“ ”(空格)的分隔符。输出的结果将是一个字符串,包含所有的firstName,后面跟着lastName。
2. 输入数据(input data)
在jq中,输入数据主要有两种类型:json文本字符串和json文件。
json文本字符串是指直接将JSON数据写入jq的命令行,如:
jq '.[] | .firstName+.lastName' < [ { "firstName": "John", "lastName": "Doe" }, { "firstName": "Jane", "lastName": "Doe" }, { "firstName": "Bill", "lastName": "Gates" }, { "firstName": "Steve", "lastName": "Jobs" } ] EOF json文件是指包含了JSON数据的文件,如: cat people.json | jq '.[] | .firstName+.lastName' 这行代码,它首先把people.json文件中的JSON数据作为输入读入,并将其作为第一个参数传递给jq。 3. 输出格式(output format) 在默认情况下,jq会将结果输出为JSON格式。但是,在某些情况下,这种默认输出可能不是你所期望的结果。因此,为了满足不同的需求,jq还支持多种输出格式,包括: - 紧凑格式(默认格式):它使用JSON格式,但是压缩所有的空格和换行符。 - 全面格式(加上参数 -M):它使用JSON格式,并为key和value之间添加了空格和换行符。 - 文本格式(加上参数 -r):它将筛选出的结果输出为文本格式,而不是JSON格式。 下面是一些jq输出格式的例子: 例(1): 把JSON数据中所有的firstName和lastName筛选出来,并将结果输出为文本格式: cat people.json | jq -r '.[] | .firstName+.lastName' 例(2): 把JSON数据中所有的firstName和lastName筛选出来,并将结果输出为全面的JSON格式: cat people.json | jq -M '.[] | {firstName, lastName}' 四. jq的常用操作 在jq中,有许多常用的操作,包括处理数组、对象、日期、字符串、逻辑和数学运算等。下面列出几个重要的操作。 1. 处理数组 jq对于操作数组有很多实用的工具,比如map和sort等。 map操作:该操作可以将一个数组中的元素应用到一个指定的函数中,并返回一个新的数组。下面是一个例子: cat numbers.json | jq 'map(. * 10)' 这个例子中,map操作定义了一个将数组中的所有元素乘以10的函数。当它被应用到输入数组后,它将返回一个新的数组,其中每个元素都是原始数组中相应位置的元素乘以10。 sort操作:该操作可以将一个数组中的元素按照给定的条件排序。下面是一个例子: cat numbers.json | jq 'sort' 这个例子中,sort操作将在有升序排列输入数组中的所有元素中。如果你想按照对象属性排序,可以这样写: cat people.json | jq 'sort_by(.lastName)' 该例子将按照lastName属性对JSON数据进行排序。 2. 处理对象 在jq中,对象操作主要包括合并对象和选择对象属性等。 合并对象:该操作可以合并两个或多个对象,并将它们的属性组合成一个新对象。以下是一个例子: cat people.json | jq '.[0] * {"age": 30}' 这个例子中,*操作将两个对象(数组的第一个元素和一个新对象)组合成了一个新对象,其中原始对象的属性和新对象的属性在相同的字段名称下进行了合并。 选择对象属性:该操作可以从一个对象中选择一个或多个属性,只保留选定的属性在对象中。下面是一个例子: cat people.json | jq '.[] | {firstName, lastName, age}' 该例子使用{|}操作符选择people.json数组中的所有对象,并从每个对象中仅选择firstName, lastName, age三个属性。然后,它将当前对象重新构造为仅包含所选属性的新对象,并将它们作为新的数组输出。 3. 处理日期 在jq中处理日期的一个常用方法是使用to_date()函数和fromdate()函数。 to_date()函数:该函数可以将ISO 8601格式的日期字符串转换成Unix时间戳。以下是一个例子: cat events.json | jq '.created_at | tostring | strptime("%Y-%m-%dT%H:%M:%S.%NZ") | mktime' 这个例子中,to_date()函数将created_at属性的ISO 8601日期字符串转换为Unix时间戳。 fromdate()函数:这个函数与to_date()函数相反,它用于将Unix时间戳转换成ISO 8601日期格式的字符串。以下是一个例子: cat events.json | jq '.created_at | fromdate' 这个例子中,fromdate()函数将created_at属性的Unix时间戳转换为ISO 8601格式的日期字符串。 4. 处理字符串 在jq中处理字符串主要用到字符串拼接(concatenation)、字符串截取(substr)和字符串替换(replace)等操作。 字符串拼接(concatenation):该操作可以将两个字符串拼接在一起。以下是一个例子: cat people.json | jq '.[] | .firstName+" "+.lastName' 这个例子中,字符串拼接操作使用+操作符将firstName和lastName属性组合在一起,每个字符串之间有一个空格分隔符。 字符串截取(substr):该操作可以截取一个字符串的一部分。以下是一个例子: cat people.json | jq '.[] | .firstName | substr(0,1)' 这个例子中,substr()函数从firstName属性的第一个字符(start=0)截取一个字符(length=1)。 字符串替换(replace):该操作可以将一个字符串中的一个子字符串替换为另一个字符串。以下是一个例子: cat data.json | jq 'replace("apple","orange")' 这个例子中,replace()函数将字符串"apple"替换为字符串"orange"。 5. 处理逻辑和数学运算 在jq中,有很多实用的工具,用于处理逻辑和数学运算,包括比较运算符(cmp), 逻辑运算符(logic),数学运算符和位运算符等。 比较运算符(cmp):该操作可以比较两个值之间的大小关系。以下是一个例子: cat numbers.json | jq 'min, max, (.[0] < .[1]), (.[0] == .[3]), (.[2] > .[4]), (.[0] != .[1])' 这个例子比较了输入数字数组中的几个不同浮点数之间的大小关系。 逻辑运算符(logic):该操作用于处理布尔类型的值。以下是一个例子: cat people.json | jq '[.[] | select(.age < 30 and (.firstName == "John" or .lastName == "Doe"))]' 这个例子中,获取people.json数组中满足.age < 30并且firstName属性等于"John"或lastName属性等于"Doe"的元素。 数学运算符和位运算符:这些操作包括加减乘除和位移等操作,用于对数值进行处理。以下是一个例子: cat numbers.json | jq '[.[] | . + 10, . * 2, . % 3, .^2]' 该例子将输入数字数组中的每个元素加上10、把它们每个元素两倍、它们每个元素模3、它们每个元素的平方。结果将是一个新的数组,其中包含所有操作的结果。