JSONPath 是一个类似 XPath 的 JSON 工具,可以从JSON文档中提取指定信息,并且JSONPath 提供多种语言实现版本,包括:JavaScript、Python、PHP和Java。
JSONPath 表达式始终引用 JSON 结构,就像 XPath 表达式与 XML/HTML文档结合使用一样。
JsonPath 和 XPath 的比较 :
JsonPath 与 XPath 的语法对比如下图所示:

JsonPath安装位置:Python安装目录的Scripts文件夹下
安装命令:pip install jsonpath
如图所示下载成功:

使用实例一:以全国城市的JSON文件为例
全国城市的JSON文件地址:http://www.lagou.com/lbs/getAllCitySearchLabels.json,需要保存JSON文件到本地。
1、获取以字母A为开头的所有城市名称
import json
import jsonpath
# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# 获取所有 A[*]
nameA_list = jsonpath.jsonpath(city_json,'$.content.data.allCitySearchLabels.A[*].name')
# 获取下标为2的数据 A[2],[0]:获得列表的内容
name2 = jsonpath.jsonpath(city_json,'$.content.data.allCitySearchLabels.A[2].name')[0]
print(nameA_list)
print(name2)
执行结果:jsonpath解析返回的数据是列表类型
['安阳', '安庆', '鞍山', '阿克苏', '安顺', '安康', '澳门', '阿拉尔', '阿里地区', '阿拉善盟']
鞍山
2、获取所有城市的名称
import json
import jsonpath
# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# 获取所有城市的名称和编码code
name_list = jsonpath.jsonpath(city_json,'$..name')
code_list = jsonpath.jsonpath(city_json,'$..code')
print(name_list)
print(code_list)
3、获取以字母B为开头的最后一个城市和名称
import json
import jsonpath
# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
name_list = jsonpath.jsonpath(city_json,'$..B[(@.length-1)]')
name = jsonpath.jsonpath(city_json,'$..B[(@.length-1).name]')
print(name_list)
print(name)
执行结果:
[{'id': 597, 'name': '巴彦淖尔', 'parentId': 534, 'code': '070400000', 'isSelected': False}]
['巴彦淖尔']
4、获取以字母C为开头的前两个城市
import json
import jsonpath
# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# C[0,1,2] 和 C[:3]作用相同,都是获得前三个数据
name_list = jsonpath.jsonpath(city_json,'$..C[0,1,2]')
name_list1 = jsonpath.jsonpath(city_json,'$..C[:3]')
name = jsonpath.jsonpath(city_json,'$..C[0,1,2].name')
name1 = jsonpath.jsonpath(city_json,'$..C[:3].name')
print(name_list)
print(name_list1)
print(name)
print(name1)
执行结果:
[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False}, {'id': 8, 'name': '重庆', 'parentId': 4, 'code': '040100000', 'isSelected': False}, {'id': 749, 'name': '长沙', 'parentId': 547, 'code': '190100000', 'isSelected': False}]
[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False}, {'id': 8, 'name': '重庆', 'parentId': 4, 'code': '040100000', 'isSelected': False}, {'id': 749, 'name': '长沙', 'parentId': 547, 'code': '190100000', 'isSelected': False}]
['成都', '重庆', '长沙']
['成都', '重庆', '长沙']
5、获取以字母G为开头且包含provincialCapital的城市
import json
import jsonpath
# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
city = jsonpath.jsonpath(city_json,'$..G[?(@.provincialCapital)]')
print(city)
执行结果:
[{'id': 763, 'name': '广州', 'parentId': 548, 'code': '200100000', 'isSelected': False, 'provincialCapital': True}]
6、获取以字母C为开头且price大于13000的城市
import json
import jsonpath
# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
city = jsonpath.jsonpath(city_json,'$..C[?(@.price>13000).name]')
print(city)
执行结果:
[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False, 'provincialCapital': True, 'price': 15000},
{'id': 8, 'name': '重庆', 'parentId': 4, 'code': '040100000', 'isSelected': False, 'price': 17000}, {'id': 749, 'name': '长沙', 'parentId': 547, 'code': '190100000', 'isSelected': False, 'price': 16000}]