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

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类的第三方库,可以帮助我们实现很多进阶灵活的操作。

(完)

看完本文有收获?请转发分享给更多人

关注「Python那些事」,做全栈开发工程师

(0)

相关推荐

  • 14.4 JSON数据

    14.4 JSON数据

  • python接口自动化33-json解析神器jsonpath

    前言 做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言. 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间,于是就有 ...

  • FlatBuffers使用小结

    最近做一个Android APP,由于离线业务需求,需要在启动APP时候同步大量数据到APP上,遇到了JSON性能瓶颈.从下方的图片中可以看出,当使用 json 传输数据,在解析json的时候会产生大 ...

  • Python中JSON结构数据的高效增删改操作

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

  • httprunner学习7-extract提取content返回对象

    前言 提取response返回的对象数据,用extract关键字.前面有关于token的取值,通过content.token取值. 本篇详细讲解如何从返回的json数据提取出想要的各种数据 conte ...

  • 科研数据可视化 | 基于Python绘制环形布局关系图

    环形布局关系图 本文介绍的是通过Python制作的环形布局关系图,通过展现节点以及节点之间的关系,特别适合多个地理位置之间联系的一种可视化表现形式.将抽象概念进行形象性表达,将抽象语言进行具象图形可视 ...

  • python接口自动化38-jsonpath提取接口返回值

    前言 接口返回的json数据,需要取值后断言,本篇使用jsonpath来提取接口返回的数据 接口返回数据 接口返回一个 json 类型的数据,以下数据是很常见的一种数据结构 { "code& ...

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

    ❝ 本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes ❞ 1 简介 在日常使用Python的过程中,我 ...

  • python中的json、pickle

    json 提供了四个功能: dumps:将json数据转换为字符串 json.dumps(obj,skipkeys=False,separators=None,sort_keys=False) loa ...

  • Python中三种格式化输出的方式

    程序中经常会出现这样的 场景:要求用户输入信息,然后打印成固定的格式 比如要求用户输入用户名和年龄,然后打印如下格式: # a = '------------- info -------------' ...

  • FastJson 处理json数据中对象相互引用,最后转为json字符串出现占位符("$ref"标识循环引用)"的问题

    环境 fastjson 1.2.41 问题说明 FastJson 问题 在json对象中有多个地方引用了相同的对象,在经过几次转换转为json字符串的时候会出现占位符, 然后使用fastjson 解析 ...

  • Python骚操作,提取pdf文件中的表格数据!

    在实际研究中,我们经常需要获取大量数据,而这些数据很大一部分以pdf表格的形式呈现,如公司年报.发行上市公告等.面对如此多的数据表格,采用手工复制黏贴的方式显然并不可取.那么如何才能高效提取出pdf文 ...

  • Python处理JSON数据,建议收藏!

    作者:Peter 来源:Python编程时光 在实际工作中,尤其是web数据的传输,我们经常会遇到json数据.它不像常见的文本数据.数值数据那样友好,而且它和Python中的字典类型数据又很相像,给 ...

  • python接口自动化39-JMESPath解析json数据

    前言 前面学了 jsonpath 可以很好的解析 json 数据,提取出我们想要的内容,对于平常的基本工作没太大的问题,但有一点点小遗憾. jsonpath 的 python 库功能并不是很强大,不支 ...

  • Python中Json和dict区别对比?入门分享!

    最近有人问小编说:Python开发中字典和Json的区别是什么?关于这个问题,小编通过下文为大家介绍一下. 什么是字典? 字典是一种数据结构,而json是一种数据格式就会有一些形式上的限制,比如jso ...

  • Python中字典和json有什么差异?

    正在学习或者已经学习Python的人应该都知道字典和json,那么你对它们了解多少呢?你知道字典和json区别是什么吗? 什么是字典?是一种数据结构,json是一种数据格式,格式就会有一定形式上限制, ...