本文示例代码及文件已上传至我的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就可以这样做:

  1. import json
  2. from jsonpath import jsonpath
  3. # 读入示例json数据
  4. with open('json示例.json', encoding='utf-8') as j:
  5. demo_json = json.loads(j.read())
  6. # 配合JSONPath表达式提取数据
  7. jsonpath(demo_json, '$..steps[*].duration')

  其中$..steps[*].duration就是我们用于描述数据位置规则的JSONPath语句,配合jsonpath()便可以提取出对应信息,下面我们就来学习jsonpath中支持的常用JSONPath语法:

2.2 jsonpath中的常用JSONPath语法

  为了满足日常提取数据的需求,JSONPath中设计了一系列语法规则来实现对目标值的定位,其中常用的有:

  • 按位置选择节点

  在jsonpath中主要有以下几种按位置选择节点的方式:

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

  让我们来演示一下它们的一些用法:

  1. # 提取所有duration键对应值
  2. jsonpath(demo_json, '$..duration')

  1. # 提取所有steps键的子节点对应instruction值
  2. jsonpath(demo_json, '$..steps.*.instruction')

  • 索引子节点

  有些时候我们需要在选择过程中对子节点做多选或按位置选择操作,就可以使用到jsonpath中的相关功能:

  1. # 多选所有steps键的子节点对应的instruction与action值
  2. jsonpath(demo_json, '$..steps.*[instruction,action]')

  1. # 选择steps键的第0个子节点对应的instruction与action值
  2. jsonpath(demo_json, '$..steps[0][instruction,action]')
  3. # 选择steps键的第1到3(不包括3)个子节点对应的instruction与action值
  4. jsonpath(demo_json, '$..steps[1:3][instruction,action]')
  5. # 配合@,选择steps键的最后一个子节点对应的instruction与action值
  6. jsonpath(demo_json, '$..steps[(@.length-1)][instruction,action]')

  • 条件筛选

  有些时候我们需要根据子节点的某些键值对值,对选择的节点进行筛选,在jsonpath中支持常用的==!=><等比较运算符,以==比较符为例,这里配合@定位符从当前节点提取子节点,语法为?(@.键名 比较符 值)

  1. # 找到所有steps子节点中orientation为“西”的
  2. jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')

  而如果想要提取所有具有指定键的节点,可以参考下面的例子:

  1. # 找到所有具有polyline键的节点对应的polyline与road键对应值
  2. jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]')

2.3 返回结果的形式

  在前面的例子中,我们所有的返回结果直接就是提取到的满足条件的结果,而jsonpath()中还提供了另一种特殊的结果返回形式,只需要设置参数result_type=None就可以改直接返回结果为返回每个结果的JSONPath表达式:

  1. # 获取结果的JSONPath表达式
  2. jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]', result_type=None)

  以上介绍的均为jsonpath库中的常规功能,可以满足基础的json数据提取需求,而除了jsonpath之外,还有其他具有更加丰富拓展功能的JSONPath类的第三方库,可以帮助我们实现很多进阶灵活的操作,我们将在下一篇文章中继续讨论。


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札125)在Python中操纵json数据的最佳方式的更多相关文章

  1. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  2. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  3. (数据科学学习手札136)Python中基于joblib实现极简并行计算加速

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...

  4. (数据科学学习手札53)Python中tqdm模块的用法

    一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...

  5. (数据科学学习手札54)Python中retry的简单用法

    一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...

  6. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  7. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  8. (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  9. (数据科学学习手札116)Python+Dash快速web应用开发——交互表格篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

随机推荐

  1. 既然有 HTTP 请求,为什么还要用 RPC 调用?

    首先,实名赞扬题主的问题.这个问题非常好. 其次,实名反对各个上来就讲RPC好而HTTP不好的答案.因为,题主的观点非常对. HTTP协议,以其中的Restful规范为代表,其优势很大.它可读性好,且 ...

  2. Spring Cloud Data Flow整合UAA使用外置数据库和API接口

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 之前的文章<Spring Cloud Data Flow整合Cloudfoundry UAA服务做权限控制 ...

  3. theUnforgiven——项目冲刺

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018/ 小组号和队名 8组theUnforgiven ...

  4. DHCP的简单介绍与配置

    一.DHCP简介 二.DHCP报文类型 三.DHCP工作原理 四.实例操作 一.DHCP简介 DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一 ...

  5. 陋居寡闻,初探Github CLI For Windows,开启命令行撸铁时代

    简介 gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to t ...

  6. 『无为则无心』Python序列 — 23、Python序列的公共API

    目录 1.运算符 @1.+加号 @2.*乘号 @3.in或not in 2.公共方法 @1.len()方法 @2.del和del() @3.max()方法 @4.min()方法 @5.range() ...

  7. 18.自动运维工具ansible

    1 Ansible 介绍和架构 1.1 Ansible介绍 ansible 的名称来自科幻小说<安德的游戏>中跨越时空的即时通信工具,使用它可以在相距数光年的 距离,远程实时控制前线的舰队 ...

  8. Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记

    目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...

  9. gRPC 拦截器能做些什么?

    什么是拦截器? 拦截器是一种横切维度的功能延展. 具象说明一下,高速收费站就是一种拦截器.它可以做什么?收费,查证,交通控制等等,面向所有穿行过往的车辆. gRPC 拦截器主要分为两种:客户端拦截器( ...

  10. 计算机基础 | 文档神器docsify安装及基本使用

    为啥要用docsify? 神器Docsify让你的文档变得美观,配合typora,从此爱上看文档,各种优点:小巧.快速.美观.方便.快捷.上手快,可以浏览如下优秀案例 ve-charts pyecha ...