你是否曾经遇到过需要从复杂的数据结构中提取特定信息,但是因为嵌套层数繁多而不得不使用大量的 if、for 循环来处理的情况?如果这个问题不仅仅涉及一个小工具,而是会在整个项目中一直存在,那么这个问题就会变得更加复杂和愁人。
今天我们来介绍一款解决这种问题的 Python第三方库JmesPath,它可以让我们更加便捷地处理这类复杂的数据结构。
模块基础讲解
JmesPath是一款非常强大的JSON查询语言库,它用于从JSON文档或字典中轻松获得所需的数据,它可以为寻找JSON结构中的特定信息提供强大的语法支持。这个库可以用于Python以及其他编程语言,所以你可以根据需要在很多地方使用它。
Jmespath库遵循自身的语法结构,是对JSONPath和JMESPath语言的进一步扩展,旨在成为一种统一,流畅,易于使用的查询语言作为JSON、AWE相关技术的查询规范。
Jmespath的语法简单,功能却非常强大,使用它我们可以简化处理复杂JSON数据的难度,一定程度上提高编写代码的效率。
当然,作为第三方库,在使用之前,我们需要安装它
pip install jmespath

模块代码演示
首先,导入该模块import jmespath然后,构建一串JSON数据
data = {"name": "jerry","age": 26,"gender": "man","skills": [{"name": "python","level": "expert"},{"name": "javascript","level": "intermediate"},{"name": "Java","level": "novice"}]}
下面,我们演示下如何查询数据
expression = "skills[0].name"result = jmespath.search(expression, data)print(result)
代码说明: 表达式skills[0].name用于筛选出JSON数据中skills数组中的第一个元素的name属性。通过search()方法执行筛选操作,并输出结果。

输出结果:python
JmesPath语法规则应用
下面,介绍几种常用的语法规则
选择属性
查询语句:‘property_name’,表示选择名为‘property_name’的属性。
例如:‘name’,表示选择名为‘name’的属性。
{ "name": "Alice","age": 25,"address": {"city": "Beijing","country": "China" }}
查询结果:Alice
选择嵌套的属性
查询语句:‘object.property_name’,表示选择嵌套的属性。
例如:‘address.city’,表示选择‘address’对象中的‘city’属性。
{"name": "Alice","age": 25,"address": {"city": "Beijing","country": "China"}}
查询结果:Beijing
选择数组元素
查询语句:array[index],表示选择数组中指定索引位置的元素。
例如:fruits[1],表示选择fruits数组中的第二个元素。
{"fruits": ["apple","orange","banana"]}
查询结果:orange
选择数组中的所有元素
查询语句:array[*],表示选择数组中的所有元素。
例如:fruits[*],表示选择fruits数组中的所有元素。
{"fruits": ["apple","orange","banana"]}
查询结果:["apple", "orange", "banana"]
使用通配符选择多个属性或元素
查询语句:object.*,表示选择一个对象中的所有属性;array[*],表示选择数组中的所有元素。
例如:address.*,表示选择address对象中的所有属性。
{"name": "Alice","age": 25,"address": {"city": "Beijing","country": "China"}}
查询结果:{"city": "Beijing", "country": "China"}
使用管道连接多个操作
查询语句:expression1 | expression2,表示将expression1的查询结果作为expression2的输入。
例如:fruits | sort(@) | reverse(@),表示将fruits数组中的元素排序,然后翻转。
{"fruits": ["apple","orange","banana"]}
查询结果:["orange", "apple", "banana"]
这个案例比较有意思,我们看下运行效果。

以上是jmespath语法的一些例子,其中还有很多特定的字符规则和使用规则,具体请参考JmesPath官方文档。
模块案例应用
下面我们综合运用上面的知识点,演示一个更为复杂的JSON数据结构的处理过程,如下代码所示:
先构建 JSON 数据
data = {"fruits": [{"name": "banana","type": "yellow","price": 2.5},{"name": "apple","type": "red","price": 3.5},{"name": "pear","type": "yellow","price": 2.2}],"location": {"country": "China","city": "Shanghai"}}
查询语句如下:
expression = "fruits[?type=='yellow'].name"result = jmespath.search(expression, data)print(result)
代码说明:
表达式fruits[?type=='yellow'].name,该表达式用于获取类型为 yellow 的水果名称。得到的结果是一个列表,里面包含了符合条件的结果。即: ['banana', 'pear']
我们看下程序运行效果

OK,完美实现。
另外,在爬虫开发过程中,我们通常需要从一份JSON数据中提取出一些与业务相关的数据,而这些数据通常会被嵌套在JSON数据结构的不同层级中,使用JmesPath可以大大提高效率。后续我们介绍一些爬虫相关的案例。
总结提高
JmesPath 是处理JSON数据的强大工具,对于处理基于JSON的各种API请求和数据处理非常有用。它可以使我们在数据处理过程中节省大量时间和代码量。
总结来说,Jmespath简化了处理多层次JSON数据的难度,可以帮助我们在Python中快速地定位并获取所需的数据。所以如果在我们需要处理大量以JSON格式存储的数据时,Jmespath 可以是提高编写工作效率和代码可读性的一个很好的选择。