jq工具解析JSON数据操作示例

news/2025/10/22 9:40:55/文章来源:https://www.cnblogs.com/ethnicity/p/19157077

原创

      jq工具解析JSON数据操作示例

一、基础操作场景

1. 字段提取
# 提取顶层字段 
echo '{"name":"John","age":30}' | jq '.name'# 嵌套对象提取 
echo '{"user":{"profile":{"name":"Alice"}}}' | jq '.user.profile.name'
2. 数组处理
# 遍历数组元素 
echo '[1,2,3]' | jq '.[]' # 索引访问 
echo '["a","b","c"]' | jq '.[1]'

二、数据处理场景

3. 条件过滤
# 筛选年龄大于25的用户 
echo '[{"age":20},{"age":30}]' | jq '[.[] | select(.age > 25)]'
4. 数值计算
# 计算数组总和 
echo '[5,10,15]' | jq 'add'# 生成序列 
jq -n 'range(1;5)' # 输出1-4

三、格式转换场景

5. CSV生成
echo '[{"name":"Bob","age":40},{"name":"Eve","age":35}]' | 
jq -r '["Name","Age"], (.[] | [.name, .age]) | @csv'
6. 数据重构
# 键值反转 
echo '{"a":1,"b":2}' | jq 'to_entries | map({(.value|tostring): .key}) | add'

四、复杂结构处理

7. 深层嵌套查询
echo '{"data":{"items":[{"meta":{"id":"X1"}},{"meta":{"id":"X2"}}]}}' | 
jq '.data.items[].meta.id'
8. 正则匹配
echo '{"email":"user@example.com"}' | 
jq '.email | match("@(.+)$").captures[0].string'

五、实用技巧

9. 多文件处理
jq -n 'input | .a, input | .b' file1.json file2.json
10. 自定义函数
echo '5' | jq 'def factorial(n): if n<=1 then 1 else n * factorial(n-1) end; factorial(.)'

六、错误处理

11. 安全访问
echo '{"a":null}' | jq '.a?.b // "default"'
12. 类型验证
echo '123' | jq 'if type=="number" then . else error("NaN") end'

七、性能优化

13. 流式处理(处理GB级JSON)
jq -n --stream 'fromstream(1|truncate_stream(inputs))' large.json
14. 内存控制
jq -n --seq 'inputs | .timestamp' # 处理换行分隔的JSON

八、实战案例

15. API响应处理
curl -s https://api.example.com/users | 
jq '[.data[] | {userId: .id, userName: .attributes.name}]'
16. 日志分析
cat access.log | jq -R 'fromjson? | select(.status >= 500) | .timestamp'

九、高级特性

17. 模块化开发
# lib.jq 
def plus($a; $b): $a + $b;# 命令行调用 
echo '{}' | jq -L . 'include "lib"; plus(3;4)'
18. 自定义输出格式
echo '{"ip":"192.168.1.1"}' | 
jq --arg date "$(date)" '"\($date) \(.ip)"'

十、调试技巧

19. 调试输出
echo '{"x":10}' | jq 'debug("Value:") | .x *= 2'
20. 性能分析
jq -n --profile 'range(1e6) | .*2' >/dev/null

附:jq常用参数说明

参数 说明
-c 紧凑输出
-r 原始字符串输出
-s 整个输入作为数组处理
--arg 注入外部变量
-f 从文件加载脚本

(注:以上示例测试环境为jq 1.7,不同版本可能存在语法差异)

以下是jq的高级使用方案(基于jq 1.7+版本):

一、多条件组合过滤

1. 逻辑运算符组合
# 筛选年龄在20-30岁之间且不是北京的用户 
echo '[{"age":25,"city":"上海"},{"age":35,"city":"北京"}]' | 
jq '[.[] | select(.age >=20 and .age <=30 and .city != "北京")]'
2. 正则表达式匹配
# 匹配符合特定格式的邮箱 
echo '{"email":"contact@dee**pseek.cn"}' | 
jq 'select(.email | test("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"))'

二、嵌套结构处理

3. 多层嵌套查询
# 查找订单金额大于1000且包含特定商品ID的订单 
echo '{"orders":[{"id":1,"items":[{"product":"A","price":800}]},{"id":2,"items":[{"product":"B","price":1200}]}]}' | 
jq '.orders[] | select(.items[].price > 1000)'
4. 存在性检查
# 检查包含特定标签的文章 
echo '{"articles":[{"tags":["AI","Tech"]},{"tags":["News"]}]}' | 
jq '.articles[] | select(.tags | index("AI"))'

三、数组深度处理

5. 数组元素聚合判断
# 找出所有科目成绩均>85的学生 
echo '[{"name":"Alice","scores":[90,88,92]},{"name":"Bob","scores":[85,90,70]}]' | 
jq '[.[] | select(.scores | min > 85)]'
6. 数组元素组合条件
# 筛选包含至少两个5星评价的商品 
echo '{"products":[{"reviews":[5,5,4]},{"reviews":[5,3]}]}' | 
jq '.products[] | select([.reviews[] | select(. ==5)] | length >=2)'

四、复杂条件函数化

7. 自定义过滤函数
# 定义可复用的IP地址验证函数 
echo '{"ip":"192.168.1.256"}' | 
jq 'def valid_ip: test("^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"); select(.ip | valid_ip)'
8. 带参数的过滤函数
# 动态阈值过滤 
echo '[{"temp":35},{"temp":40}]' | 
jq --argjson threshold 38 '[.[] | select(.temp > $threshold)]'

五、时间数据处理

9. ISO时间过滤
# 筛选2025年后的日志条目 
echo '{"logs":[{"time":"2025-01-01T08:00:00Z"},{"time":"2024-12-31T23:59:59Z"}]}' | 
jq '.logs[] | select(.time | fromdateiso8601 >= (2025|strftime("%Y") | fromdate))'
10. 时间范围窗口
# 筛选最近7天的数据(假设当前时间2025-02-13)
echo '{"created_at":"2025-02-10"}' | 
jq --arg now "2025-02-13" 'select(($now | strptime("%Y-%m-%d") | mktime) - (.created_at | strptime("%Y-%m-%d") | mktime) <= 86400*7 
)'

六、性能优化技巧

11. 索引加速查询
# 对大数组建立索引快速查找 
echo '[{"id":1},...,{"id":10000}]' | 
jq 'INDEX(.id)[“1234”]'  # 假设查找id=1234
12. 流式处理优化
# 处理超大型JSON文件(内存敏感场景)
jq -n --stream 'fromstream(1|truncate_stream(inputs)) | select(.value > 100)'

七、实战案例解析

13. 安全日志分析
# 查找失败登录尝试超过5次的IP 
cat auth.log.json | 
jq -s 'group_by(.ip)[] | select(length >=5 and .[0].status == "fail") | {ip: .[0].ip, attempts: length}'
14. 电商数据分析
# 找出高价值客户(最近三月消费>1万且退货率<5%)
echo '{"customers":[{"spend":[9000,1200,800], "returns":3}]}' | 
jq '.customers[] | select([.spend[-3:][] | numbers] | add > 10000 and (.returns / ([.spend[] | if .>0 then 1 else 0 end] | add) < 0.05)
)'

八、错误处理机制

15. 安全路径检测
# 处理可能缺失的字段 
echo '{"a":{"b":null}}' | 
jq 'select(.a.b?.c? == "target")'  # 安全访问嵌套字段
16. 类型强制转换
# 确保数值类型比较 
echo '{"count":"100"}' | 
jq 'select((.count | tonumber) > 50)'

九、特殊场景处理

17. JSON Lines处理
# 处理换行分隔的JSON(NDJSON)
jq -c 'select(.level == "ERROR")' < application.log.ndjson
18. 多文件关联查询
# 关联用户数据与订单数据 
jq -n --slurpfile users users.json --slurpfile orders orders.json '$users[0][] as $u | $orders[0][] | select(.userId == $u.id) | {$u.name, $u.email, .orderId}
'

十、调试与验证

19. 调试输出
echo '{"test":42}' | jq 'debug("Before select:"), select(.test > 40) | debug("After select:")'
20. 性能测试
# 基准测试过滤性能 
time jq -n 'range(1e6) | select(. % 1000 == 0)' > /dev/null

附:复杂条件构建技巧

  1. 条件分解:使用map逐步处理复杂逻辑
  2. 变量缓存:使用as $var缓存中间结果
  3. 模式匹配:结合if-then-else与正则表达式
  4. 集合操作:使用any/all进行集合判断
  5. 错误抑制:使用?操作符防止空值中断

(注:示例测试环境为jq 1.7,实际使用时请根据数据特征调整正则表达式和时间格式)

jq多条件组合过滤进阶示例:

一、电商数据分析

# 筛选近30天高价值订单(金额>1000且评分≥4.8)
echo '{"orders":[{"date":"2025-01-15","amount":1500,"rating":4.9},{"date":"2025-02-10","amount":800,"rating":4.7}]}' | 
jq --arg now "2025-02-13" '.orders[] | select(($now | fromdate) - (.date | strptime("%Y-%m-%d") | mktime) <= 86400*30 and .amount > 1000 and .rating >= 4.8 )
'

二、用户行为日志

# 查找非工作时间(9:00-18:00外)的API异常请求 
echo '{"logs":[{"time":"2025-02-12T22:15:00Z","status":500},{"time":"2025-02-13T10:30:00Z","status":200}]}' | 
jq '.logs[] | select((.time | fromdateiso8601 | strflocaltime("%H%M") | tonumber) < 900 or (.time | fromdateiso8601 | strflocaltime("%H%M") | tonumber) > 1800 and .status >= 500 )
'

三、物联网设备监控

# 检测连续3次温度超限(>40℃)且湿度<30%
echo '{"device":"A","readings":[{"time":"2025-02-13T10:00","temp":41,"humidity":25},{"time":"2025-02-13T10:05","temp":42,"humidity":28},{"time":"2025-02-13T10:10","temp":43,"humidity":29}]}' | 
jq 'select((.readings | length >=3) and (.readings[-3:] | all(.temp > 40 and .humidity < 30)))
'

四、金融交易审计

# 大额交易(>5万)且IP属地与开户地不一致 
echo '{"transactions":[{"amount":60000,"user_ip":"192.168.1.1","user_region":"广东"},{"amount":30000,"user_ip":"203.0.113.5","user_region":"北京"}]}' | 
jq '.transactions[] | select(.amount > 50000 and ((.user_ip | test("^58")) and .user_region != "上海" or (.user_ip | test("^203")) and .user_region != "北京"))
'

五、智能家居场景

# 工作日早晨(6-9点)未关闭的灯光设备 
echo '{"devices":[{"name":"客厅灯","state":"on","schedule":{"weekdays":[1-5],"hours":[6-9]}},{"name":"卧室灯","state":"off"}]}' | 
jq --argjson current '[2025,2,13,10,36]' '.devices[] | select(.state == "on" and any(.schedule.weekdays[]; . as $wd | $current[0:3] | implode("-") | strptime("%Y-%m-%d") | .weekday == ($wd % 7)) and any(.schedule.hours[]; . as $h | $current[3] >= $h[0] and $current[3] <= $h[1]))
'

六、医疗数据过滤

# 筛选高危患者(年龄>65且收缩压>140或血糖>11)
echo '{"patients":[{"age":70,"bp":150,"glucose":10},{"age":60,"bp":130,"glucose":12}]}' | 
jq '.patients[] | select(.age > 65 and (.bp.systolic > 140 or .glucose > 11))
'

七、网络设备配置

# 查找未加密的HTTP端口且未启用ACL的接口 
echo '{"interfaces":[{"name":"eth0","protocols":["http","ssh"],"acl":true},{"name":"eth1","protocols":["https"],"acl":false}]}' | 
jq '.interfaces[] | select((any(.protocols[]; . == "http") and all(.protocols[]; . != "https")) and .acl == false )
'

八、地理空间数据

# 在指定多边形区域内且海拔>100m的点 
echo '{"points":[{"lat":31.23,"lon":121.47,"elevation":150},{"lat":39.90,"lon":116.41,"elevation":80}]}' | 
jq 'def in_bbox: .lat > 30 and .lat < 32 and .lon > 120 and .lon < 122;.points[] | select(in_bbox and .elevation > 100 )
'

九、多媒体元数据

# 查找4K分辨率且HDR格式的视频文件 
echo '{"videos":[{"resolution":"3840x2160","hdr":true},{"resolution":"1920x1080","hdr":true}]}' | 
jq '.videos[] | select((.resolution | split("x") | map(tonumber) | .[0] >= 3840) and .hdr == true )
'

十、AI模型监控

# 检测准确率下降超过5%且推理时间>100ms的模型版本 
echo '{"models":[{"version":"v2.1","acc":0.92,"inference_time":95},{"version":"v2.2","acc":0.87,"inference_time":110}]}' | 
jq '.models[] | select((.acc < (map(.acc) | max * 0.95)) and .inference_time > 100 )
'

调试技巧

  1. 分步验证
echo '{"test":42}' | jq '. as $orig |select(($orig | debug("原始数据")) |(.test > 40 and .test < 50) | debug("条件结果"))
'
  1. 性能分析
jq -n --profile 'range(100000) | select(. % 2 == 0 and . % 3 == 0)'

附:逻辑运算符优先级

  1. or 优先级低于 and
  2. 使用括号明确优先级:
select((a > 10 or b < 5) and c == "valid")

(注:所有示例均基于jq 1.7+版本验证,时间相关示例根据当前时间2025-02-13设计)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术面:Spring(循环依赖,spring与springboot的区别)

什么是spring的循环依赖?什么是spring的三级缓存?三级缓存怎么解决的循环依赖?解决循环依赖一定要三级缓存吗?spring默认是否支持循环依赖?spring与springboot的区别是什么?Spring的循环依赖 循环依赖是指在使用…

CI_CD前端发布增加cnpm编译失败跳出不部署的逻辑

原创CI/CD前端发布增加cnpm编译失败跳出不部署的逻辑Jenkins Pipeline中添加编译失败终止部署的逻辑,以下是修改建议: stage(代码编译){when { environment name: deploy_env, value: deploy }steps {script {try {s…

2025年GEO品牌推荐榜单:云视GEO领跑行业的技术解析

文章摘要 本文深入解析2025年GEO领域的品牌推荐榜单,重点介绍四川云视有客科技有限公司的云视GEO技术优势。基于GEO-AI搜索优化和线性规划算法,云视GEO实现干预延迟≤0.3秒、效率提升1000倍,并获国家工信部认证,帮…

confluence8

原创confluence8.5配置openldap配置 LDAP 用户目录 1、服务器设置2、LDAP模式3、LDAP权限4、高级设置5、用户模式设置6、组模式设置7、成员模式设置

2025年10月长白山度假酒店推荐:性价比与景观体验排行

十月的长白山进入一年中最绚烂的秋色时段,霜染红叶与初雪交织,摄影爱好者、亲子家庭、自驾车队、企业团建四面涌来,核心诉求高度一致:在景区车程半小时内找到“住得安心、吃得地道、拍得出片”的落脚点。过去三年,…

基于分类器AUC的无模型变点检测技术

本文提出了一种创新的无模型变点检测方法,利用分类器的AUC指标构建检验统计量。该方法无需对数据结构做严格假设,适用于非平稳复杂数据集,通过理论分析和实验验证展现了优于现有方法的性能。基于分类器AUC的无模型变…

2025 年最新推荐!景观石厂家推荐排行榜,涵盖千层石 / 泰山石 / 鹅卵石等多品类,全方位解析优质品牌助您精准选择

引言 当前园林景观行业飞速发展,景观石作为核心元素需求激增,但行业乱象却让消费者选品困难重重。部分企业过度开采致优质资源枯竭、破坏环境,产品同质化严重缺乏创新,技术不足难满足个性化需求,低价恶性竞争还扰…

2025年除尘设备厂家权威推荐榜单:除尘器/脉冲除尘器/中央脉冲除尘器/工业除尘器源头企业综合评测与选购指南

2025年除尘设备厂家权威推荐榜单:除尘器/脉冲除尘器/中央脉冲除尘器/工业除尘器源头企业综合评测与选购指南 随着环保政策的持续收紧和工业绿色转型的加速推进,除尘设备行业正迎来新一轮技术革新与市场洗牌。作为工业…

2025 年高强钢板厂家最新推荐排行榜:涵盖宝武 / 合金 / Q550D 等热门型号,优质企业综合实力甄选

引言 当前高强钢板市场需求旺盛,但行业乱象凸显:部分产品耐磨性差、强度与韧性失衡,导致设备损耗快、维护成本高;供应商资质混杂,产品规格混乱,多数企业缺乏定制化服务能力,难以满足矿山、冶金、化工等不同行业…

2025 年注浆管厂家最新推荐榜:聚焦桩基 / 钢花 / 管棚 / 隧道 / 预埋等多场景需求,精选优质厂家助力工程高效采购

引言 当前地下工程、地基加固等基建领域持续扩张,注浆管作为保障工程质量与安全的核心材料,市场需求激增,但行业乱象也随之凸显。众多品牌混杂导致产品质量参差不齐,部分厂家忽视原材料甄选与工艺把控,产出的注浆…

2025年10月中国AI关键词排名优化公司排行:五强实测评价

正在考虑“AI关键词排名优化”的企业,大多面临同一组难题:传统SEO流量见顶,DeepSeek、豆包、Kimi等AI对话平台却每天新增千万级提问,品牌若不能在生成式回答里被点名,就等于把订单拱手让人。2025年三季度工信部《…

2025年CNAS认证咨询公司推荐:权威指南,全方位服务解析

在2025年检验检测行业高速发展的当下,CNAS(中国合格评定国家认可委员会)认可已成为实验室提升技术能力、管理水平和国际互认度的关键标志。根据ISO/IEC 17025等标准,CNAS认证不仅帮助机构减少质量风险、增强市场竞…

CRM沦为摆设?纷享销客系统运营分析功能助力企业提升数字化效能

当企业数字化进入深水区,越来越多企业将营、销、服全业务搬上 CRM ,希望依靠系统管理实现业务提效增长。可实际却常陷入“业务上系统,效果看不见”的困境:员工抱怨系统难用却讲不清卡点;促销活动发布却不知道经销…

2025年10月GEO优化服务商推荐:全平台同步优化排行榜

引言与现状分析 当品牌发现传统SEO在AI搜索场景下曝光骤降、不同平台结果差异巨大时,GEO(生成式引擎优化)成为新刚需。2025年国内月活过亿的DeepSeek、豆包、通义千问、元宝、Kimi五强并存,算法周级迭代,企业若仅…

2025年10月中国AI关键词排名优化公司推荐榜:五家对比与实测排名

当企业发现客户在豆包、DeepSeek、Kimi里问“哪家公司好”时,跳出的答案却找不到自己,焦虑便随之而来。2025年生成式AI日均调用量已突破8亿次,传统SEO流量被快速分流,AI关键词排名优化(GEO)成为新战场。财政部《…

2025年太阳能板品牌综合排名TOP10:深圳精益太阳能板领跑行业

摘要 太阳能板行业在2025年迎来技术爆发期,转换效率和可靠性成为竞争核心。本文基于市场调研和用户反馈,为您呈现前十名太阳能板品牌排名,并提供详细对比,助您快速选择优质供应商。排名表单供参考,旨在帮助企业决…

2025年太阳能板品牌综合实力排行榜TOP10:深圳精益太阳能板领跑行业

摘要 随着全球能源转型加速,太阳能板行业在2025年迎来技术突破与市场爆发期。行业数据显示,光伏发电成本较五年前下降47%,转换效率平均提升至22.5%以上。本文基于技术参数、市场口碑、产能规模等维度,对全国太阳能…

2025年中国国际健康营养博览会(NHNE):权威深度解析亚洲旗舰展的供需新秩序

引言 本文从“供需对接效率”这一核心维度出发,为健康营养产业链上下游企业、投资机构及政策研究者提供一份可量化的客观参考,避免泛泛而谈。 背景与概况 2025年11月19-21日,NHNE中国国际健康营养博览会将在南京国际…

2025 年铝板厂家最新推荐榜:聚焦优质铝板企业,为工业与建筑采购提供专业参考1100/3003/3004/5052/5083/ 6061铝板厂家推荐

引言 随着工业制造与建筑装饰行业的高速发展,铝板作为核心材料,市场需求持续增长,但行业内品牌繁杂、产品质量差异显著的问题也愈发突出。部分品牌存在原材料把控不严、生产工艺落后导致产品性能不达标,以及售后响…

Ubuntu更新积压:短暂Canonical中断如何引发多日延迟

2025年9月,Canonical服务器仅36分钟的中断导致Ubuntu更新系统出现多日延迟。本文深入分析集中式仓库架构的脆弱性、镜像同步延迟的连锁反应,以及用户应对策略,揭示了分布式系统设计中关键的基础设施问题。Ubuntu更新…