Json文件
对象是属性、值的集合。一个对象开始与"{" ,结束于"}"。每一个属性名和值间用":"分隔。每个属性间用","分隔。
值可以是字符串,数字,逻辑值,数组,对象,null。 数字:整数或浮点数 字符串:在双引号中 逻辑符:true和false
数组:在方括号中 对象:在花括号中 null: 代表空
示范
- jq "." 解析全部内容
- jq ".name,.id" 解析key为name和id的value ,为分隔符,基于当前
一般使用
{"name":"lolicp","id":68,"url":"https://lolicp.com"}
解析Json格式文件内容
[root@Frpd-vip ~]# jq . a
{
"name": "lolicp",
"id": 68,
"url": "https://lolicp.com"
}
解析指定key内容
[root@Frpd-vip ~]# jq .name a
"lolicp"
[root@Frpd-vip ~]# jq .name,.id a
"lolicp"
68
常规
- jq ".name_list|.[].name,.[].id" 解析指定key值,当有[]时需|进行分割
{"name_list":[{"name":"zhangsan","id":12},{"name":"lisi","id":13}],"id":68,"url":"https://lolicp.com"}
[root@Frpd-vip ~]# jq . a
{
"name_list": [
{
"name": "zhangsan",
"id": 12
},
{
"name": "lisi",
"id": 13
}
],
"id": 68,
"url": "https://lolicp.com"
}
[root@Frpd-vip ~]# jq ".name_list|.[].name,.[].id" a
"zhangsan"
"lisi"
12
13
[root@Frpd-vip ~]# jq ".name_list|.[]|.name,.id" a
"zhangsan"
12
"lisi"
13
添加或更新字段
可以添加或更新 JSON 对象中的字段:
[root@lolicp.com ~]# jq '.id = 11|.ida = 22' a
{
"name": "lolicp",
"id": 11,
"url": "https://lolicp.com",
"ida": 22
}
删除字段
可以删除 JSON 对象中的某个字段:
[root@lolicp ~]# jq 'del(.id)' a
{
"name": "lolicp",
"url": "https://lolicp.com"
}
重新指定输出内容
- jq ".name_list|.[]|{mingcheng:.name,yonghuid:.id}" 将[]中的内容进行重输出
[root@Frpd-vip ~]# jq ".name_list|.[]|{mingcheng:.name,yonghuid:.id}" a
{
"mingcheng": "zhangsan",
"yonghuid": 12
}
{
"mingcheng": "lisi",
"yonghuid": 13
}
[root@Frpd-vip ~]# jq ".name_list|.[]|{mingcheng:.name,yonghuid:.id,xinzeng:\"codedd\",xinzen2:12}" a
{
"mingcheng": "zhangsan",
"yonghuid": 12,
"xinzeng": "codedd",
"xinzen2": 12
}
{
"mingcheng": "lisi",
"yonghuid": 13,
"xinzeng": "codedd",
"xinzen2": 12
}
过滤字段
根据条件匹配指定关键字:
[root@lolicp ~]# cat a
[
{"name": "xianyun", "age": 30},
{"name": "lolicp", "age": 25},
{"name": "loli", "age": 22}
]
[root@lolicp ~]# jq '.[] | select(.age > 25)' a
{
"name": "xianyun",
"age": 30
}
指定名字
[root@lolicp ~]# jq '.[]|select(.name =="xianyun")' a
{
"name": "xianyun",
"age": 30
}
指定数值处理
[root@lolicp ~]# jq '.[].age += 1' a
[
{
"name": "xianyun",
"age": 31
},
{
"name": "lolicp",
"age": 26
},
{
"name": "loli",
"age": 23
}
]
高级用法
使用变量
使用变量来简化复杂的查询:
jq --arg city "New York" '.address.city = $city' data.json
复杂过滤
组合多个条件进行复杂过滤:
jq '.[] | select(.age > 25 and .name == "John")' array.json
格式化输出
美化 JSON 输出:
jq '.' data.json > pretty.json
合并多个 JSON 文件
假设有两个 JSON 文件 file1.json
和 file2.json
:
jq -s '.[0] * .[1]' file1.json file2.json
当然可以,以下是更多 jq
命令的高级用法和示例,以便于更深入地进行教学。
高级过滤和转换
条件表达式
使用条件表达式进行更复杂的处理:
{
"users": [
{"name": "John", "age": 30},
{"name": "Jane", "age": 25},
{"name": "Doe", "age": 22}
]
}
选择年龄大于 25 的用户,并标记其为成年人:
jq '.users[] | if .age > 25 then .adult = true else .adult = false end' users.json
多条件过滤
对 JSON 对象中的元素进行多条件过滤:
jq '.users[] | select(.age > 20 and .name | test("J"))' users.json
包含检查
检查某个 JSON 对象是否包含特定的键:
jq 'has("name")' data.json
对于数组中的元素:
jq '.users[] | select(has("name"))' users.json
数组和对象操作
分组和聚合
对数组中的元素进行分组和聚合:
[
{"name": "John", "age": 30, "group": "A"},
{"name": "Jane", "age": 25, "group": "B"},
{"name": "Doe", "age": 22, "group": "A"}
]
按照 group
字段分组:
jq 'group_by(.group) | map({group: .[0].group, members: .})' array.json
数组拆分
将数组拆分成两个部分:
jq 'split_at(2)' array.json
数组连接
将多个数组连接成一个数组:
[
{"name": "John"},
{"name": "Jane"}
]
[
{"age": 30},
{"age": 25}
]
连接两个 JSON 文件:
jq -s '.[0] + .[1]' file1.json file2.json
高级 JSON 构建
构建复杂的 JSON 结构
从简单的数据构建复杂的 JSON 结构:
jq -n '{
users: [
{name: "John", age: 30},
{name: "Jane", age: 25}
]
}'
生成序列
生成一个数值序列:
jq -n '[range(5)]'
字符串操作
对 JSON 数据中的字符串进行操作,例如拼接:
jq '.name + " Doe"' data.json
文件操作
读取多个文件
可以一次性读取多个 JSON 文件并进行处理:
jq -s '.[0] + .[1]' file1.json file2.json
导出为文件
将处理结果导出到文件中:
jq '.' data.json > output.json
使用模块
导入模块
jq
支持模块化,通过导入模块进行代码重用。假设有一个模块文件 module.jq
:
# module.jq
def double: . * 2;
使用模块:
jq --argfile mod module.jq -n 'import $mod as m; m::double(4)'
错误处理和调试
错误处理
处理可能出现的错误,例如:
jq 'try .name catch "No name found"' data.json
调试输出
在复杂查询中添加调试输出:
jq 'debug' data.json
其他实用技巧
字符串转义
处理包含特殊字符的字符串:
jq -R 'split("\n")' <<< 'line1\nline2\nline3'
日期处理
假设有一个包含日期的 JSON 文件 dates.json
:
[
"2023-01-01T12:00:00Z",
"2024-01-01T12:00:00Z"
]
转换日期格式:
jq '.[].date = (.[] | fromdateiso8601 | todate)' dates.json
条件计数
计算满足特定条件的元素个数:
jq '[.[] | select(.age > 25)] | length' array.json