在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值
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数据的最佳方式相关推荐
- php数据存储mysql_php – 在MySQL中存储路线数据的最佳方式
我正在开发一个应用程序,它要求我存储一些位置的方向,下面是我试图存储的数据的示例: 方向1 从西部:乘528 East(Beechline),经过机场出口,然后从13号出口驶入Narcoossee R ...
- 在Python中使用JSON数据
Since its inception, JSON has quickly become the de facto standard for information exchange. Chances ...
- python中 将json数据转化为excel表格
json数据格式 这里我需要进行数据转换的json数据格式有亿点复杂,为了方便我后续的处理,我想把他转换成excel来观察,json数据如下所示: 借助python代码查看后,得知json数据构成:2 ...
- C#中关于JSON数据的解析方式-JArray和JObeject:Error reading JArray from JsonReader. Current JsonReader item
一般而言,数据接口返回给我们的数据格式虽然都是json格式,但是不同的格式用的解析方式不一样,主要分为数组型和非数组型,两则格式区别如下: 数组型:(最外面有数组包裹) string jsonText ...
- 在python中使用json格式存储数据
在python中使用json格式存储数据 代码如下: import jsonlist1 = [{'A': [1, 2, 3, 4, 5, 6], 'B': [3, 4, 5, 6, 7]},{'C': ...
- python返回json数据_python和flask中返回JSON数据的方法
在python中可以使用json将数据格式化为JSON格式: 1.将字典转换成JSON数据格式: s=['张三','年龄','姓名'] t={} t['data']=s return json.dum ...
- html怎么拿json数据,如何使用Python从HTML数据中提取JSON数据?
我正在尝试制作一个python脚本,可以在outlook中读取JSON数据电子邮件.但是问题是如何从HTML数据中提取JSON数据.这是我要提取的原始JSON数据.在{ "vpn_detai ...
- 在Python中使用设置文件的最佳做法是什么? [关闭]
本文翻译自:What's the best practice using a settings file in Python? [closed] I have a command line scrip ...
- 【机器学习基础】如何在Python中处理不平衡数据
特征锦囊:如何在Python中处理不平衡数据 ???? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何处理 ...
最新文章
- Spring Cloud Alibaba 高级特性 基于 Sleuth+Zipkin 实施链路跟踪体系
- cxGrid 使用指南 1
- 什么是你的职涯“本钱”
- matlab错误:Variable 'a' cannot be saved to a MAT-file whose version is older than 7.3.
- 你的“大厂梦”不是梦,你离大厂仅差我这篇博客!!!【吐血推荐】
- 2440 8字数码管 显示0到10 c语言,51单片机对8位数码管依次显示0-7的设计
- java dao模式_Java DAO 模式
- Asp.Net Core安全防护-客户端IP白名单限制
- core java面试题_CoreJava基础面试题
- BJFU-ACM 12月8日月赛官方题解
- 虚拟化架构下虚拟交换机和分布式虚拟交换机解析
- rust卡在服务器列表不显示,rust服务器废料设置
- [项目管理-29]:SMART项目计划制定与PDCA闭环监控,珠联璧合,双剑合一。
- php使用gd库合并图片,php使用GD库合并简单图片并变动部分颜色
- HTML+CSS 仿写京东网站界面
- PDF如何修改编辑文字?两种简单的方法分享给大家
- layui解决数据表格右侧有空白现象
- BPM流程建模开发详解
- 搭建一个PHP后台的开发环境你所需要配置东西都有哪些?XAMPP问题
- ad用户如何和计算机名对应,计算机加域和AD里相应对象的问题
热门文章
- RabbitMQ消息队列(十三)-VirtualHost与权限管理
- (转)java datetime date 类型
- idea中git打tag(亲测)
- 解决MySQL事务未提交导致死锁报错 避免死锁的方法
- Git commit -m与-am
- SpringBoot整合mybatis(CRUD)
- html css图标怎么跟文字并排,CSS高级技巧:精灵图、字体图标、CSS三角做法、CSS用户界面样式、vertical-align属性应用、溢出文字省略号、常见布局技巧...
- 【spring boot】【thymeleaf】SPEL调用静态方法和静态属性
- linux tar压缩解压命令
- linux 压缩文件夹的一部分