JSONPath 是一個類似 XPath 的 JSON 工具,可以從JSON文檔中提取指定信息,並且JSONPath 提供多種語言實現版本,包括:JavaScript、Python、PHP和Java。
JSONPath 表達式始終引用 JSON 結構,就像 XPath 表達式與 XML/HTML文檔結合使用一樣。
JsonPath 和 XPath 的比較 :
JsonPath 與 XPath 的語法對比如下圖所示:
JSONPath 官方文檔
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}]