Python中操纵json数据的最佳方式

2021-08-1820:55:24编程语言入门到精通Comments1,718 views字数 2137阅读模式

1 简介

在日常使用 Python 的过程中,我们经常会与 json 格式的数据打交道,尤其是那种嵌套结构复杂的 json 数据,从中抽取复杂结构下键值对数据的过程枯燥且费事。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

而熟悉 xpath 的朋友都知道,对于 xml 格式类型的具有层次结构的数据,我们可以通过编写 xpath 语句来灵活地提取出满足某些结构规则的数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

类似的,JSONPath 也是用于从 json 数据中按照层次规则抽取数据的一种实用工具,在 Python 中我们可以使用 jsonpath 这个库来实现 JSONPath 的功能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

Python中操纵json数据的最佳方式

2 在 Python 中使用 JSONPath 提取 json 数据

jsonpath 是一个第三方库,所以我们首先需要通过 pip install jsonpath 对其进行安装。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

一个简单的例子

安装完成后,我们首先来看一个简单的例子,从而初探其使用方式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

这里使用到的示例 json 数据来自高德地图步行导航接口,包含了从天安门广场到西单大悦城的步行导航结果,原始数据如下,层次结构较深:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

Python中操纵json数据的最佳方式

假如我想要获取其嵌套结构中 steps 键值对下每段行程的耗时 duration 数据,配合 jsonpath 就可以这样做:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

import json
from jsonpath import jsonpath

# 读入示例json数据
with open('json示例.json', encoding='utf-8') as j:
    demo_json = (())

# 配合JSONPath表达式提取数据
jsonpath(demo_json, '$..steps[*].duration')
Python中操纵json数据的最佳方式

其中 $..steps[*].duration 就是我们用于描述数据位置规则的 JSONPath 语句,配合 jsonpath() 便可以提取出对应信息,下面我们就来学习 jsonpath 中支持的常用 JSONPath 语法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

2.2 jsonpath 中的常用 JSONPath 语法

为了满足日常提取数据的需求,JSONPath 中设计了一系列语法规则来实现对目标值的定位,其中常用的有:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

  • 「按位置选择节点」

在 jsonpath 中主要有以下几种按位置选择节点的方式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

功能语法
根节点$
当前节点@
子节点.或[]
任意子节点*
任意后代节点..

让我们来演示一下它们的一些用法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

# 提取所有duration键对应值
jsonpath(demo_json, '$..duration')
Python中操纵json数据的最佳方式
# 提取所有steps键的子节点对应instruction值
jsonpath(demo_json, '$..steps.*.instruction')
Python中操纵json数据的最佳方式
  • 「索引子节点」

有些时候我们需要在选择过程中对子节点做多选或按位置选择操作,就可以使用到 jsonpath 中的相关功能:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

# 多选所有steps键的子节点对应的instruction与action值
jsonpath(demo_json, '$..steps.*[instruction,action]')
Python中操纵json数据的最佳方式
# 选择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值
jsonpath(demo_json, '$..steps[(@.length-1)][instruction,action]')
Python中操纵json数据的最佳方式
  • 「条件筛选」

有些时候我们需要根据子节点的某些键值对值,对选择的节点进行筛选,在 jsonpath 中支持常用的 ==、!=、>、< 等比较运算符,以==比较符为例,这里配合 @ 定位符从当前节点提取子节点,语法为 ?(@. 键名 比较符 值):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

# 找到所有steps子节点中orientation为“西”的
jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')
Python中操纵json数据的最佳方式

而如果想要提取所有具有指定键的节点,可以参考下面的例子:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

# 找到所有具有polyline键的节点对应的polyline与road键对应值
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]')
Python中操纵json数据的最佳方式

返回结果的形式

在前面的例子中,我们所有的返回结果直接就是提取到的满足条件的结果,而 jsonpath() 中还提供了另一种特殊的结果返回形式,只需要设置参数 result_type=None 就可以改直接返回结果为返回每个结果的 JSONPath表达式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

# 获取结果的JSONPath表达式
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]', result_type=None)
Python中操纵json数据的最佳方式

以上介绍的均为 jsonpath 库中的常规功能,可以满足基础的 json 数据提取需求,而除了 jsonpath 之外,还有其他具有更加丰富拓展功能的 JSONPath 类的第三方库,可以帮助我们实现很多进阶灵活的操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/22039.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/22039.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定