问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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"]

查询差异说明

  1. 获取书名和价格的对象映射
  • JMESPath 能通过 {key: value} 的语法动态构造新的对象,与原始结构无关。
  • JsonPath 无法支持动态结构生成,只能返回已有字段。
  1. 筛选书价超过 JSON 内部变量 expensive_limit 的书籍
  • JMESPath 能直接引用 JSON 内部变量,非常灵活。
  • JsonPath 无法直接支持动态变量引用,必须借助外部脚本处理变量后注入过滤器。
  1. 结构重构
  • 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 的提取和操作更加高效!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号