本文示例代码及文件已上传至我的
Github
仓库
https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
在日常使用
Python
的过程中,我们经常会与
json
格式的数据打交道,尤其是那种嵌套结构复杂的
json
数据,从中抽取复杂结构下键值对数据的过程枯燥且费事。
而熟悉
xpath
的朋友都知道,对于
xml
格式类型的具有层次结构的数据,我们可以通过编写
xpath
语句来灵活地提取出满足某些结构规则的数据。
类似的,
JSONPath
也是用于从
json
数据中按照层次规则抽取数据的一种实用工具,在
Python
中我们可以使用
jsonpath
这个库来实现
JSONPath
的功能。
2 在Python中使用JSONPath提取json数据
jsonpath
是一个第三方库,所以我们首先需要通过
pip install jsonpath
对其进行安装。
2.1 一个简单的例子
安装完成后,我们首先来看一个简单的例子,从而初探其使用方式:
这里使用到的示例
json
数据来自
高德地图步行导航
接口,包含了从天安门广场到西单大悦城的步行导航结果,原始数据如下,层次结构较深:
假如我想要获取其嵌套结构中
steps
键值对下每段行程的耗时
duration
数据,配合
jsonpath
就可以这样做:
import json
from jsonpath import jsonpath
# 读入示例json数据
with open('json示例.json', encoding='utf-8') as j:
demo_json = json.loads(j.read())
# 配合JSONPath表达式提取数据
jsonpath(demo_json, '$..steps[*].duration')
其中
$..steps[*].duration
就是我们用于描述数据位置规则的
JSONPath
语句,配合
jsonpath()
便可以提取出对应信息,下面我们就来学习
jsonpath
中支持的常用
JSONPath
语法:
2.2 jsonpath中的常用JSONPath语法
为了满足日常提取数据的需求,
JSONPath
中设计了一系列语法规则来实现对目标值的定位,其中常用的有:
在
jsonpath
中主要有以下几种按位置选择节点的方式:
让我们来演示一下它们的一些用法:
# 提取所有duration键对应值
jsonpath(demo_json, '$..duration')
# 提取所有steps键的子节点对应instruction值
jsonpath(demo_json, '$..steps.*.instruction')
有些时候我们需要在选择过程中对子节点做多选或按位置选择操作,就可以使用到
jsonpath
中的相关功能:
# 多选所有steps键的子节点对应的instruction与action值
jsonpath(demo_json, '$..steps.*[instruction,action]')
# 选择steps键的第0个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[0][instruction,action]')
# 选择steps键的第1到3(不包括3)个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[1:3][instruction,action]')
# 配合@,选择steps键的最后一个子节点对应的instruction与action值