告别徒手掏数据!给JSON配上“GPS导航”:JSONPath零基础入门
一、 出发前先问为什么需要JSONPath想象这个场景你拿到一份来自API的复杂JSON数据比如电商订单。你想找出“所有已支付订单的商品名称”。如果用最基础的Python方式你需要遍历订单列表。检查每个订单的status字段是否为“paid”。如果是再遍历这个订单里的商品列表提取name。把这些name收集起来。代码会充满循环和条件判断就像在迷宫里按图索骥。而JSONPath让你能直接“描述”目的地“给我所有状态为‘paid’的订单下的商品名称路径。”它用一种类似文件路径的语法例如$.orders[?(.status‘paid’)].items[*].name来实现。你的代码立刻变得声明式、清晰且强大。二、 核心概念什么是JSONPath表达式2.1 一句话理解JSONPath是一种表达式语言用于在JSON结构中定位和提取特定的节点值。你可以把它理解为JSON数据的“查询语句”。2.2 两个核心符号$这是表达式的起点代表整个JSON文档的根。几乎所有JSONPath表达式都从它开始。.或[]这是访问子节点的操作符。点号(.)用于访问有名称的属性键如$.store.book。方括号([])更通用可以访问带名称的属性$[‘store’][‘book’]尤其当键名包含特殊字符时很有用。访问数组索引$.store.book[0]获取第一本书索引从0开始。进行切片和过滤后面会讲。2.3 你的第一个表达式让我们用一个最简单的例子来感受一下。假设我们有如下的JSON数据一个简单的书信息importjsonfromjsonpath_ngimportparse# 我们会用这个流行的Python库# 示例数据一本简单的书book_json { “title”: “Python编程从入门到实践”, “author”: “Eric Matthes”, “price”: 89.9, “tags”: [“编程” “Python” “入门”] } datajson.loads(book_json)# 目标获取书名title# 表达式从根($)开始访问子节点 “title”expressionparse(‘$.title’)# 执行查询matchesexpression.find(data)# 打印结果print(f“书名是{matches[0].value}”)# 输出书名是Python编程从入门到实践看$.title这个表达式就像在说“从根目录开始找名叫title的那个东西。” 这比写data[‘title’]并没有更简单但别急这只是开始。三、 语法详解你的导航指令手册让我们用一个更丰富的JSON数据来学习各种“导航指令”。# 一份更复杂的书店数据store_json { “store”: { “name”: “知识书店” “books”: [ { “id”: 1 “title”: “Python基础教程” “author”: “Magnus Lie Hetland” “price”: 68.00 “in_stock”: true }, { “id”: 2 “title”: “流畅的Python” “author”: “Luciano Ramalho” “price”: 118.00 “in_stock”: false }, { “id”: 3 “title”: “算法图解” “author”: “Aditya Bhargava” “price”: 49.00 “in_stock”: true } ] } } datajson.loads(store_json)3.1 基础导航层层深入# 1. 获取书店名字expr_store_nameparse(‘$.store.name’)print(f“书店名{expr_store_name.find(data)[0].value}”)# 知识书店# 2. 获取所有书籍列表expr_all_booksparse(‘$.store.books’)all_booksexpr_all_books.find(data)[0].valueprint(f“共有{len(all_books)}本书”)# 共有3本书# 3. 获取第一本书的标题expr_first_book_titleparse(‘$.store.books[0].title’)print(f“第一本书{expr_first_book_title.find(data)[0].value}”)# Python基础教程3.2 通配符*匹配任意节点当你不确定具体名称或者想获取所有符合条件的节点时就用它。# 获取所有书籍的标题books数组里的每一项的titleexpr_all_titlesparse(‘$.store.books[*].title’)titles[match.valueformatchinexpr_all_titles.find(data)]print(“所有书名”,titles)# [‘Python基础教程’ ‘流畅的Python’ ‘算法图解’]# 通配符也可以用在对象属性上expr_all_store_infoparse(‘$.store.*’)forinfoinexpr_all_store_info.find(data):print(f“store下的节点{info.value}”)# 会打印’知识书店‘ 和 books列表3.3 数组切片[start:end:step]像Python列表一样语法和Python列表切片完全相同。# 获取前两本书 (索引0到1不包含2)expr_sliceparse(‘$.store.books[0:2]’)first_two_books[match.valueformatchinexpr_slice.find(data)]print(“前两本书的ID”,[book[‘id’]forbookinfirst_two_books])# [1 2]# 获取最后一本书索引-1expr_last_bookparse(‘$.store.books[-1]’)last_bookexpr_last_book.find(data)[0].valueprint(f“最后一本书{last_book[‘title’]}”)# 算法图解3.4 过滤表达式?()最强大的“筛选器”这是JSONPath的灵魂让你基于条件查找数据。# 1. 找出所有有库存的书 (in_stock true)expr_in_stockparse(‘$.store.books[?(.in_stocktrue)]’)in_stock_books[match.valueformatchinexpr_in_stock.find(data)]print(“有库存的书”,[book[‘title’]forbookinin_stock_books])# [‘Python基础教程’ ‘算法图解’]# 2. 找出价格超过100元的书expr_expensiveparse(‘$.store.books[?(.price100)]’)expensive_booksexpr_expensive.find(data)print(“价格100的书”,expensive_books[0].value[‘title’])# 流畅的Python# 3. 找出作者名字包含 ‘Python’ 的书# 注意jsonpath-ng支持在过滤条件里使用部分Python字符串方法expr_python_in_titleparse(‘$.store.books[?(.title.contains(“Python”))]’)python_books[match.valueformatchinexpr_python_in_title.find(data)]print(“书名含‘Python’的书”,[book[‘title’]forbookinpython_books])# [‘Python基础教程’ ‘流畅的Python’]解释一下?(.in_stock true)?()表示这是一个过滤条件。代表当前正在被检查的节点在这里就是books数组里的每一本书。所以整个表达式就是在检查对于每一本书()其in_stock属性是否等于true。四、 实战演练解决一个真实问题场景你从服务器拿到一份用户活动日志JSON格式需要快速找出所有“登录失败”事件的用户ID和设备类型。logs_json [ { “event_id”: 1001, “user_id”: “U123” “event_type”: “login_success” “device”: “iPhone” “timestamp”: “2023-10-27T08:00:00Z” }, { “event_id”: 1002, “user_id”: “U456” “event_type”: “login_fail” “device”: “Android” “error_code”: “PWD_WRONG” “timestamp”: “2023-10-27T08:05:00Z” }, { “event_id”: 1003, “user_id”: “U789” “event_type”: “view_page” “device”: “Windows PC” “page”: “/home” “timestamp”: “2023-10-27T08:10:00Z” }, { “event_id”: 1004, “user_id”: “U456” “event_type”: “login_fail” “device”: “Android” “error_code”: “SESSION_EXPIRED” “timestamp”: “2023-10-27T08:15:00Z” } ] logs_datajson.loads(logs_json)# 任务找出所有登录失败的事件# 思路# 1. 数据根是一个数组所以表达式从 $ 开始。# 2. 我们需要筛选数组里 event_type 为 “login_fail” 的元素。# 3. 从这些元素里提取 user_id 和 device。# 第一步先筛选出失败事件expr_fail_eventsparse(‘$[?(.event_type“login_fail”)]’)fail_events[match.valueformatchinexpr_fail_events.find(logs_data)]print(“找到的登录失败事件”)foreventinfail_events:print(f”-用户{event[‘user_id’]} 设备{event[‘device’]} 错误码{event.get(‘error_code’ ‘N/A’)}”)# 更简洁的一步到位写法直接提取目标字段expr_target_infoparse(‘$[?(.event_type“login_fail”)].[“user_id”“device”]’)target_matchesexpr_target_info.find(logs_data)print(“\n提取的目标信息列表”)formatchintarget_matches:print(f”-{match.value}”)# 注意对于提取多个字段这里结构稍有不同可能需要按需处理但它展示了可能性。五、 一些重要的注意事项选择正确的库Python中有多个JSONPath库如jsonpath-ng,jsonpath。jsonpath-ng功能强大且活跃是初学者的好选择。安装它pip install jsonpath-ng。表达式返回的是列表expression.find(data)总是返回一个匹配项的列表即使只匹配到一个。所以要通过matches[0].value来获取第一个匹配值。记得检查列表是否为空。不是万能的JSONPath主要用来查询和定位它不能直接用来修改、删除JSON数据。你需要根据它找到的路径再用Python代码去操作原始数据。性能提示递归操作符..可以搜索任意深度的节点在大JSON上可能较慢。对于已知结构的深层访问尽量使用精确路径如$.a.b.c而不是$..c。六、 总结与下一步恭喜你现在已经掌握了JSONPath的核心概念和基本语法。你已经学会如何用$.开始导航。用.和[]访问子节点。用[*]匹配所有。用[0],[-1],[0:2]处理数组。用[?(.condition)]进行强大的条件筛选。给你的实践建议打开你的一个项目找一个真实的、结构稍复杂的JSON文件或API响应。尝试用JSONPath提取几个你关心的数据比如配置文件里的某个深层配置或API返回的特定列表项。把之前需要多行循环的代码尝试用一行JSONPath表达式替换感受其中的简洁与优雅。JSONPath就像给你的JSON数据赋予了“可查询”的超能力。从此面对层层嵌套的数据结构你不再需要徒手挖掘而可以像一位拥有地图的探险家精准直达宝藏所在。思考与实践对于上面store_json中的数据你能写出一个JSONPath表达式直接找出“有库存(in_stock为true)且价格低于70元”的那本书的书名吗试试看把你的答案发在评论区提示过滤条件里可以用and连接多个条件如?(.in_stock true and .price 70)

相关新闻

小程序毕设项目:基于springboot+小程序的校园点餐系统小程序的设计与实现(源码+文档,讲解、调试运行,定制等)

小程序毕设项目:基于springboot+小程序的校园点餐系统小程序的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/6 10:47:15 阅读更多 →
小程序计算机毕设之基于微信小程序的校园跑腿小程序基于springboot+小程序的校园跑腿小程序设计与实现(完整前后端代码+说明文档+LW,调试定制等)

小程序计算机毕设之基于微信小程序的校园跑腿小程序基于springboot+小程序的校园跑腿小程序设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/4 11:20:14 阅读更多 →
计算机小程序毕设实战-基于Springboot的公交线路查询系统的设计与实现基于springboot+小程序的城市公交查询系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机小程序毕设实战-基于Springboot的公交线路查询系统的设计与实现基于springboot+小程序的城市公交查询系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/5/17 3:28:52 阅读更多 →

最新新闻

Excel ROUND函数底层原理与财务工程级避坑指南

Excel ROUND函数底层原理与财务工程级避坑指南

1. 项目概述:为什么一个“四舍五入”函数值得写上万字?Excel里敲下ROUND(A1,2),结果立刻出来——看起来简单得不能再简单。但如果你在财务报表里用它算过增值税、在工程预算中处理过材料损耗率、在科研数据里校验过有效数字,你大概…

2026/7/6 10:46:37 阅读更多 →
Plone电商基建加固:GetPaid Recipe Release 1.4.1深度解析

Plone电商基建加固:GetPaid Recipe Release 1.4.1深度解析

1. 项目概述:一个被低估的 Plone 电商基建工具包更新 Plone 是个老派但极其扎实的内容管理系统,尤其在政府、教育、科研类机构里扎根很深。它不像 WordPress 那样靠主题和插件堆出花哨界面,而是靠严格的权限模型、内容生命周期管理和可审计性…

2026/7/6 10:46:37 阅读更多 →
ZODB对象数据库原理与Zope内容管理实战

ZODB对象数据库原理与Zope内容管理实战

1. 项目概述:当应用服务器与数据库在对象层面“无缝焊接”我第一次接触 Zope 是在 1998 年,那会儿连“Web 应用框架”这个词都还没被广泛使用。打开文档,第一反应不是兴奋,而是皱眉——“这玩意儿默认不让我连 MySQL?”…

2026/7/6 10:46:37 阅读更多 →
Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南在Linux服务器管理中,防火墙配置是确保系统安全的关键环节。面对不同的发行版和业务需求,系统管理员常常需要在firewalld、iptables和ufw这三种主流防火墙工具之间做…

2026/7/6 10:44:32 阅读更多 →
可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解摘要传统城市安防指挥体系存在视频孤岛、时空基准割裂、预警处置脱节、调度无空间量化支撑、事后复盘证据碎片化五大核心痛点,指挥链路停留在“看画面、接警情、人工派单”的线性被动模式,无…

2026/7/6 10:44:32 阅读更多 →
如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程 【免费下载链接】eulerfs-test test scripts for eulerfs 项目地址: https://gitcode.com/openeuler/eulerfs-test 前往项目官网免费下载:https://ar.openeuler.org/ar/ eulerfs-test是openEul…

2026/7/6 10:42:30 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻