本文示例代码及文件已上传至我的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值
jsonpath(demo_json, '$..steps[(@.length-1)][instruction,action]')

  • 「条件筛选」

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

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

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

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

2.3 返回结果的形式

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

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

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


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

推荐阅读

Pandas处理数据太慢,来试试Polars吧!

懒人必备!只需一行代码,就能导入所有的Python库

绝!关于pip的15个使用小技巧

介绍10个常用的Python内置函数,99.99%的人都在用!

可能是全网最完整的 Python 操作 Excel库总结!

在Python中操纵json数据的最佳方式相关推荐

  1. php数据存储mysql_php – 在MySQL中存储路线数据的最佳方式

    我正在开发一个应用程序,它要求我存储一些位置的方向,下面是我试图存储的数据的示例: 方向1 从西部:乘528 East(Beechline),经过机场出口,然后从13号出口驶入Narcoossee R ...

  2. 在Python中使用JSON数据

    Since its inception, JSON has quickly become the de facto standard for information exchange. Chances ...

  3. python中 将json数据转化为excel表格

    json数据格式 这里我需要进行数据转换的json数据格式有亿点复杂,为了方便我后续的处理,我想把他转换成excel来观察,json数据如下所示: 借助python代码查看后,得知json数据构成:2 ...

  4. C#中关于JSON数据的解析方式-JArray和JObeject:Error reading JArray from JsonReader. Current JsonReader item

    一般而言,数据接口返回给我们的数据格式虽然都是json格式,但是不同的格式用的解析方式不一样,主要分为数组型和非数组型,两则格式区别如下: 数组型:(最外面有数组包裹) string jsonText ...

  5. 在python中使用json格式存储数据

    在python中使用json格式存储数据 代码如下: import jsonlist1 = [{'A': [1, 2, 3, 4, 5, 6], 'B': [3, 4, 5, 6, 7]},{'C': ...

  6. python返回json数据_python和flask中返回JSON数据的方法

    在python中可以使用json将数据格式化为JSON格式: 1.将字典转换成JSON数据格式: s=['张三','年龄','姓名'] t={} t['data']=s return json.dum ...

  7. html怎么拿json数据,如何使用Python从HTML数据中提取JSON数据?

    我正在尝试制作一个python脚本,可以在outlook中读取JSON数据电子邮件.但是问题是如何从HTML数据中提取JSON数据.这是我要提取的原始JSON数据.在{ "vpn_detai ...

  8. 在Python中使用设置文件的最佳做法是什么? [关闭]

    本文翻译自:What's the best practice using a settings file in Python? [closed] I have a command line scrip ...

  9. 【机器学习基础】如何在Python中处理不平衡数据

    特征锦囊:如何在Python中处理不平衡数据 ???? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何处理 ...

最新文章

  1. Spring Cloud Alibaba 高级特性 基于 Sleuth+Zipkin 实施链路跟踪体系
  2. cxGrid 使用指南 1
  3. 什么是你的职涯“本钱”
  4. matlab错误:Variable 'a' cannot be saved to a MAT-file whose version is older than 7.3.
  5. 你的“大厂梦”不是梦,你离大厂仅差我这篇博客!!!【吐血推荐】
  6. 2440 8字数码管 显示0到10 c语言,51单片机对8位数码管依次显示0-7的设计
  7. java dao模式_Java DAO 模式
  8. Asp.Net Core安全防护-客户端IP白名单限制
  9. core java面试题_CoreJava基础面试题
  10. BJFU-ACM 12月8日月赛官方题解
  11. 虚拟化架构下虚拟交换机和分布式虚拟交换机解析
  12. rust卡在服务器列表不显示,rust服务器废料设置
  13. [项目管理-29]:SMART项目计划制定与PDCA闭环监控,珠联璧合,双剑合一。
  14. php使用gd库合并图片,php使用GD库合并简单图片并变动部分颜色
  15. HTML+CSS 仿写京东网站界面
  16. PDF如何修改编辑文字?两种简单的方法分享给大家
  17. layui解决数据表格右侧有空白现象
  18. BPM流程建模开发详解
  19. 搭建一个PHP后台的开发环境你所需要配置东西都有哪些?XAMPP问题
  20. ad用户如何和计算机名对应,计算机加域和AD里相应对象的问题

热门文章

  1. RabbitMQ消息队列(十三)-VirtualHost与权限管理
  2. (转)java datetime date 类型
  3. idea中git打tag(亲测)
  4. 解决MySQL事务未提交导致死锁报错 避免死锁的方法
  5. Git commit -m与-am
  6. SpringBoot整合mybatis(CRUD)
  7. html css图标怎么跟文字并排,CSS高级技巧:精灵图、字体图标、CSS三角做法、CSS用户界面样式、vertical-align属性应用、溢出文字省略号、常见布局技巧...
  8. 【spring boot】【thymeleaf】SPEL调用静态方法和静态属性
  9. linux tar压缩解压命令
  10. linux 压缩文件夹的一部分