jq轻松入门:如何定义与操作JSON数组**
在JSON(JavaScript Object Notation)数据格式中,数组(Array)是一种非常重要且常用的数据结构,它用于存储有序的值的集合,在处理JSON数据时,我们经常需要创建、定义或修改JSON数组。jq是一个轻量级、灵活的命令行JSON处理器,它使得在命令行下定义和操作JSON数组变得异常简单,本文将详细介绍如何使用jq来定义JSON数组,并辅以实例说明。
JSON数组基础回顾
在jq之前,我们先简单回顾一下JSON数组的定义:
- JSON数组是值(value)的有序集合。
- 值可以是字符串、数字、布尔值、null、另一个JSON对象或JSON数组。
- 数组用方括号
[]包围。 - 值之间用逗号 分隔。
示例JSON数组:
["apple", "banana", "cherry"]
[1, 2, 3, 4, 5]
["name", "age", 30, true, null]
[{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
使用jq定义JSON数组
jq提供了多种方式来定义JSON数组,从简单的字面量到复杂的构造表达式。
直接使用字面量定义
最直接的方式就是使用jq的数组字面量语法,这与JSON数组的语法非常相似。
示例1:定义一个简单的字符串数组
假设我们想创建数组 ["apple", "banana", "cherry"],可以在jq中直接这样写:
echo '["apple", "banana", "cherry"]' | jq .
或者,更直接地,使用jq的 -n (null input) 选项来从命令行直接生成:
jq -n '["apple", "banana", "cherry"]'
输出:
[ "apple", "banana", "cherry" ]
示例2:定义一个包含不同类型值的数组
jq -n '["hello", 123, true, null, {"key": "value"}]'
输出:
[
"hello",
123,
true,
null,
{
"key": "value"
}
]
使用jq的数组构造函数
jq也提供了类似编程语言中的数组构造方式,特别是在需要动态生成数组元素时非常有用。
示例3:使用范围生成数字数组
jq支持范围操作符 来生成序列。
# 生成0到4的数组 jq -n '[range(5)]'
输出:
[ 0, 1, 2, 3, 4 ]
# 生成1到10,步长为2的数组 jq -n '[range(1; 11; 2)]'
输出:
[ 1, 3, 5, 7, 9 ]
示例4:基于输入生成数组
jq的强大之处在于它能处理输入流,假设我们有一个文件 fruits.txt 内容如下:
apple
banana
cherry
我们可以使用 inputs 函数(或 )来逐行读取并构建数组:
# 使用 -s (--slurp) 选项将所有输入行读入一个数组 jq -n -R '[inputs]' fruits.txt
或者:
cat fruits.txt | jq -n -R '[inputs]'
输出:
[ "apple", "banana", "cherry" ]
这里 -R 表示将每行作为原始字符串处理,inputs 会逐个读取输入行。
通过过滤和映射现有数组生成新数组
在实际应用中,我们常常需要从一个现有的JSON数据中提取部分元素构成新的数组,这时,jq的过滤、映射等功能就派上用场了。
假设我们有如下JSON数据,保存在 data.json 中:
{
"fruits": [
{"name": "apple", "color": "red"},
{"name": "banana", "color": "yellow"},
{"name": "grape", "color": "purple"}
],
"prices": [1.2, 0.8, 2.5]
}
示例5:提取对象数组中的某个属性值构成新数组
我们想提取所有水果的名字到一个新数组:
cat data.json | jq '.fruits[].name'
这会输出每个水果的名字,每行一个,如果我们希望它是一个数组:
cat data.json | jq '[.fruits[].name]'
输出:
[ "apple", "banana", "grape" ]
示例6:结合条件过滤生成数组
我们只想要颜色是 "red" 或 "yellow" 的水果的名字:
cat data.json | jq '[.fruits[] | select(.color == "red" or .color == "yellow") | .name]'
输出:
[ "apple", "banana" ]
使用逗号操作符合并数组或构建数组
jq中逗号 用于将多个表达式的结果合并成一个数组。
示例7:合并多个值或数组
# 合并单个值 jq -n '[1, 2, 3, "a", "b"]'
# 合并多个数组 jq -n '[[1,2], [3,4], [5]]'
这会创建一个包含三个数组的数组,如果我们想扁平化合并:
jq -n '[[1,2], [3,4], [5]] | flatten'
输出:
[ 1, 2, 3, 4, 5 ]
jq定义JSON数组的方式灵活多样:
- 直接字面量:适用于简单的、静态的数组定义,语法直观。
- 数组构造函数:如
range()用于生成数字序列,inputs()用于从输入流构建数组,非常适合动态生成。 - 过滤与映射:利用
jq强大的选择器、select()过滤、map()映射(以及简写的|.property)从现有JSON数据中提取和重组元素构成新数组,这是jq最常用的场景之一。 - 逗号操作符:用于快速合并多个值或表达式结果为数组。
这些方法,你就能在命令行中游刃有余地定义和操作JSON数组,从而高效地处理各种JSON数据任务。jq的简洁与强大,使其成为开发者处理JSON数据的得力助手。



还没有评论,来说两句吧...