jq 1.7 使用手册:JSON 处理利器详解
jq 项目地址: https://gitcode.com/gh_mirrors/jq1/jq
概述
jq 是一个轻量级且功能强大的命令行 JSON 处理器,它允许用户以高效的方式对 JSON 数据进行查询、转换和操作。与传统的 JSON 解析工具不同,jq 提供了一套完整的函数式编程语言来处理 JSON 数据。
核心概念
过滤器(Filters)基础
jq 程序本质上是由一系列过滤器组成的管道。每个过滤器接收输入并产生输出,这些过滤器可以组合使用形成复杂的数据处理流程。
关键特点:
- 每个过滤器都有输入和输出
- 即使是简单的字面量(如 "hello" 或 42)也是过滤器
- 通过管道符号
|
连接多个过滤器 - 支持函数式编程风格的操作
基本操作示例
# 基本格式验证和美化输出
echo '{"name":"John","age":30}' | jq '.'
# 提取特定字段
echo '{"name":"John","age":30}' | jq '.name'
常用过滤器详解
1. 身份过滤器 .
最简单的过滤器,原样输出输入内容,常用于 JSON 格式验证和美化。
# 格式化 JSON 输出
curl -s https://api.example.com/data | jq '.'
2. 对象属性访问
简单属性访问 .foo
# 提取 name 字段
echo '{"name":"Alice","age":25}' | jq '.name'
带特殊字符的属性访问 .["foo"]
# 处理包含特殊字符的键名
echo '{"first.name":"Bob"}' | jq '.["first.name"]'
安全属性访问 .foo?
当属性可能不存在时使用,避免报错:
echo '[1,2,3]' | jq '.name?' # 输出 null 而不报错
3. 数组操作
jq 提供了丰富的数组处理能力:
# 获取数组长度
echo '[1,2,3]' | jq 'length'
# 数组映射
echo '[{"value":1},{"value":2}]' | jq 'map(.value)'
# 数组过滤
echo '[1,2,3,4]' | jq '.[] | select(. > 2)'
高级功能
1. 条件表达式
# 条件判断
echo '{"age":20}' | jq 'if .age >= 18 then "adult" else "child" end'
2. 自定义函数
# 定义并使用函数
echo '10' | jq 'def double: .*2; double'
3. 递归下降
# 递归处理嵌套结构
echo '{"a":{"b":{"c":1}}}' | jq '.. | .c? // empty'
实用技巧
1. 数据转换
# 转换数据格式
echo '{"timestamp":1625097600}' | jq '.timestamp | todate'
2. 多文件处理
# 合并多个 JSON 文件
jq -s 'add' file1.json file2.json
3. 性能优化
对于大型 JSON 文件,使用 --stream
选项进行流式处理:
jq --stream '...' large-file.json
常见问题解决方案
-
特殊字符处理:对于包含特殊字符的键名,使用
.["key"]
形式而非.key
-
空值处理:使用
//
操作符提供默认值echo '{"name":null}' | jq '.name // "unknown"'
-
精度问题:处理大数字时注意 IEEE754 双精度限制
总结
jq 1.7 提供了强大而灵活的 JSON 处理能力,从简单的数据提取到复杂的数据转换都能胜任。通过掌握其核心概念和各种过滤器,可以显著提高处理 JSON 数据的效率。无论是日常开发中的数据调试,还是构建数据处理管道,jq 都是一个不可或缺的工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考