jq 1.7 使用手册:JSON 处理利器详解

jq 1.7 使用手册:JSON 处理利器详解

jq 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

常见问题解决方案

  1. 特殊字符处理:对于包含特殊字符的键名,使用 .["key"] 形式而非 .key

  2. 空值处理:使用 // 操作符提供默认值

    echo '{"name":null}' | jq '.name // "unknown"'
    
  3. 精度问题:处理大数字时注意 IEEE754 双精度限制

总结

jq 1.7 提供了强大而灵活的 JSON 处理能力,从简单的数据提取到复杂的数据转换都能胜任。通过掌握其核心概念和各种过滤器,可以显著提高处理 JSON 数据的效率。无论是日常开发中的数据调试,还是构建数据处理管道,jq 都是一个不可或缺的工具。

jq jq 项目地址: https://gitcode.com/gh_mirrors/jq1/jq

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余印榕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值