JSON 数据解析利器:深度对比 JMESPath 与 JsonPath
创作时间:
作者:
@小白创作中心
JSON 数据解析利器:深度对比 JMESPath 与 JsonPath
引用
CSDN
1.
https://blog.csdn.net/lgf228/article/details/145077451
在现代软件开发中,JSON已成为数据交换的标准格式。为了高效处理和解析这些复杂的数据,开发者需要掌握JMESPath和JsonPath这两种强大的JSON查询语言。本文将深入对比这两者的特性、用法及实际应用,帮助你选择最合适的工具。
语法特性一览
在选择查询工具之前,首先了解其基本语法特性非常关键。以下是JMESPath和JsonPath的主要语法特性的对比表:
语法特性 | JMESPath | JsonPath |
|---|---|---|
基本查询 | 使用点表示法引用字段:data.field | 使用美元符号表示根节点:$.field |
数组访问 | 方括号访问数组:employees[*] | 使用类XPath方式:$.employees[*] |
过滤器 | ?用于过滤:employees[?age > 28] | 使用?()表示过滤:$.employees[?(@.age > 28)] |
选择多个字段 | 可返回构造新对象:{name: field1, age: field2} | 只能单一提取字段,缺乏多字段一体化映射 |
通配符 | 使用*:employees[*].name | 通配符类似:$.employees[*].name |
嵌套查询 | 支持直接嵌套:data.employees[*].name | 使用类似语法:$.employees[*].name |
数据转换 | 支持,比如:employees[*].{FullName: name} | 不支持复杂对象转化 |
绝对路径 | 支持深层字段路径:root.child.field | 支持类似路径:$..field |
小结:
- JMESPath:支持更复杂的数据转换、动态字段映射和嵌套操作,适合处理复杂场景。
- JsonPath:规则更简单直接,适合轻量级过滤和提取需求。
复杂 JSON 查询实例
接下来,我们通过一个具体的 JSON 数据示例,深入了解两者在实际应用中的表现。
测试用 JSON 数据
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95,
"ratings": [4, 5]
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99,
"ratings": [5, 5]
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"price": 22.99,
"ratings": [5, 4, 3]
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive_limit": 15
}
查询对比表
查询目标 | JMESPath 查询语法 | JsonPath 查询语法 | 查询结果 |
|---|---|---|---|
1. 获取所有书籍的标题 | store.book[*].title | $.store.book[*].title | ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"] |
2. 筛选出价格高于 15 的书籍 | store.book[?price > 15] | $.store.book[?(@.price > 15)] | [{"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", ...}] |
3. 书名和价格的对象映射 | store.book[*].{BookTitle: title, BookPrice: price} | 不支持 | [{"BookTitle": "Sayings of the Century", "BookPrice": 8.95}, ...] |
4. 获取所有书籍的评分 | store.book[*].ratings | $.store.book[*].ratings | [[4, 5], [5, 5], [5, 4, 3]] |
5. 获取评分大于某值的书 | store.book[?contains(ratings, 5)] | $.store.book[?(@.ratings[?(@ == 5)].length() > 0)] | [{"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", ...}, ...] |
6. 获取书价超过 expensive_limit 的书籍 | store.book[?price > expensive_limit] | 无法直接支持,需$引入变量的外部脚本 | [{"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", ...}] |
7. 获取单车信息及其颜色 | store.bicycle.{Color: color, Price: price} | 不支持 | {"Color": "red", "Price": 19.95} |
8. 结构重构:提取书籍和单车价格 | {Books: store.book[*].price, BicyclePrice: store.bicycle.price} | 不支持 | {"Books": [8.95, 12.99, 22.99], "BicyclePrice": 19.95} |
9. 获取所有书的作者 | store.book[*].author | $.store.book[*].author | ["Nigel Rees", "Evelyn Waugh", "J. R. R. Tolkien"] |
查询差异说明
- 获取书名和价格的对象映射:
- JMESPath 能通过
{key: value}的语法动态构造新的对象,与原始结构无关。 - JsonPath 无法支持动态结构生成,只能返回已有字段。
- 筛选书价超过 JSON 内部变量
expensive_limit的书籍:
- JMESPath 能直接引用 JSON 内部变量,非常灵活。
- JsonPath 无法直接支持动态变量引用,必须借助外部脚本处理变量后注入过滤器。
- 结构重构:
- JMESPath 能以新对象的形式提取多个字段值,甚至跨对象整合。
- JsonPath 不支持此类复杂构造。
高级语言中的支持能力
了解工具在不同编程语言中的支持情况,可以帮助你更好地选择适合的实现。以下是JMESPath和JsonPath在多种主流编程语言中的实现及特点:
语言 | JMESPath 支持组件 | JsonPath 支持组件 |
|---|---|---|
Python | - 组件名:jmespath - 特点:官方支持,适合数据查询和动态转换,语法灵活易用 | - 组件名:jsonpath-rw - 特点:支持基本查询与过滤,易用性高,但不支持数据转换 |
Java | - 组件名:JmesPath-Java - 特点:高性能,支持复杂嵌套和转换操作 | - 组件名:JsonPath - 特点:流行组件,功能稳定,支持常规查询与过滤 |
JavaScript | - 组件名:jmespath.js - 特点:轻量级,性能良好,遵从标准语法 | - 组件名:JSONPath-Plus - 特点:在基础JsonPath上加入扩展功能 |
Go | - 组件名:go-jmespath - 特点:官方实现,体积小,解析高效 | - 组件名:JsonPath - 特点:支持基础JsonPath功能,但不支持较为高级的操作 |
Ruby | - 组件名:jmespath.rb - 特点:适合Ruby JSON操作场景,功能齐全 | - 组件名:JsonPath Ruby - 特点:简单易用,适合常规查询 |
PHP | - 组件名:目前暂无官方实现,但可通过直接调用 jmespath.js 实现 | - 组件名:Flow JSONPath - 特点:适合于标准JsonPath的解析 |
C# | - 组件名:暂无官方支持组件,可通过第三方调用 jmespath.js | - 组件名:JsonPath.Net - 特点:支持标准JsonPath,C#社区维护库 |
Shell | - 组件名:JMESPath CLI - 特点:官方推荐,在 Shell 终端中直接处理 JSON 数据 | - 组件名:jp JsonPath CLI - 特点:功能基础但易用 |
语言支持总结
- JMESPath 的实现更加关注数据重构和动态转换,因此适用于需要构造复杂 JSON 结构的场景。大部分语言有官方或社区支持的高性能实现。
- JsonPath 则更适合轻量级查询,虽然数据转换能力较弱,但社区生态广泛,支持更多语言。
总结与建议
为什么选择 JMESPath?
- 高级需求场景:支持多字段映射、变量绑定和动态数据结构生成。
- 灵活函数:例如筛选条件中的
contains()、动态数组操作等。 - 性能优秀:适合大规模嵌套 JSON 数据,且查询性能优化较好。
为什么选择 JsonPath?
- 轻量查询任务:语法接近 XPath,更适合直接筛选和获取特定字段。
- 生态广泛:与 XPath 类似,许多团队和工具都容易熟练应用 JsonPath。
- 静态需求:适合对固定结构 JSON 的快速提取。
通过以上语法特性和复杂查询示例的对比分析,希望你能根据项目需求选择合适的工具,让 JSON 的提取和操作更加高效!
热门推荐
好茶怎么选?茶叶分类与选购技巧全解析
瑜伽与冥想对焦虑症的改善作用
离婚诉讼庭审发言技巧与注意事项
最新!2024年全国高职院校新增人工智能技术应用专业名单出炉
实验室搬迁项目的时间规划
最全的民事法律行为分类
车辆在高速抛锚了怎么办?这份应急指南请收好
手把手教你开具电商登记需要的网络经营场所证明
工业醋酸钠促微生物反硝化反应路径
泰克示波器双通道切换操作指南
待客之道:14个喝茶礼节,让你的茶艺更显优雅
中航光电:民品拉动营收增长,转战新能源前景是否可期?
Nature子刊:武汉大学唐其柱团队揭示司美格鲁肽有益心脏健康的机制
这部小说,写出了一个中年危机女性的内心独白
漫步科伦坡,探索这座斯里兰卡网红景点的魅力之旅
李白诗歌的艺术成就影响
糟粕醋火锅:传统发酵工艺与现代美食文化的绝妙融合
将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?
“砍向官僚主义”,阿根廷总统送给马斯克一把电锯
管道内窥镜检测:工业与医疗领域的先进检测技术
2024年高考志愿填报必备!55张图详解大学专业,很实用
提升企业文化效益的策略与实践探讨
李白《塞下曲六首(其一)》诗意解析及赏析
2024年官微原创科普榜单出炉
警钟长鸣 | 禁种铲毒——禁毒知识宣传教育!
趋势分析|AI 技术热潮下,虚拟偶像与传统 KOL 谁更胜一筹?
犯罪成本对人的影响:法律责任与社会后果的双重剖析
彼得大帝为对沙俄进行西化改革亲身前往西欧,其改革更有先见之明
港股的买卖规则如何理解掌握?这种理解掌握有哪些实际应用?
不要在代码中随便使用try...catch了