备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 数据科学学习手札 (数据科学学习手札125)在Python中操纵json数据的最佳方式
2 0

海报分享

(数据科学学习手札125)在Python中操纵json数据的最佳方式

本文示例代码及文件已上传至我的 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值