0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

jsonpath库中的常规功能介绍

Linux爱好者 来源:Python大数据分析 作者: 费弗里 2021-09-01 14:11 次阅读

1 简介

在日常使用Python的过程中,我们经常会与json格式的数据打交道,尤其是那种嵌套结构复杂的json数据,从中抽取复杂结构下键值对数据的过程枯燥且费事。

而熟悉xpath的朋友都知道,对于xml格式类型的具有层次结构的数据,我们可以通过编写xpath语句来灵活地提取出满足某些结构规则的数据。

类似的,JSONPath也是用于从json数据中按照层次规则抽取数据的一种实用工具,在Python中我们可以使用jsonpath这个库来实现JSONPath的功能。

2 在Python中使用JSONPath提取json数据jsonpath是一个第三方库,所以我们首先需要通过pip install jsonpath对其进行安装。

2.1 一个简单的例子安装完成后,我们首先来看一个简单的例子,从而初探其使用方式:

这里使用到的示例json数据来自高德地图步行导航接口,包含了从天安门广场到西单大悦城的步行导航结果,原始数据如下,层次结构较深:

f2beeac2-0ad0-11ec-911a-12bb97331649.png

假如我想要获取其嵌套结构中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’)

f2cab01e-0ad0-11ec-911a-12bb97331649.png

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

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

「按位置选择节点」

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

功能语法

根节点$

当前节点@

子节点。或[]

任意子节点*

任意后代节点。。

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

# 提取所有duration键对应值

jsonpath(demo_json, ‘$..duration’)

f2eb80dc-0ad0-11ec-911a-12bb97331649.png

# 提取所有steps键的子节点对应instruction值

jsonpath(demo_json, ‘$..steps.*.instruction’)

f2f7c37e-0ad0-11ec-911a-12bb97331649.png

索引子节点」

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

# 多选所有steps键的子节点对应的instruction与action值

jsonpath(demo_json, ‘$..steps.*[instruction,action]’)

f323adb8-0ad0-11ec-911a-12bb97331649.png

# 选择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]’)

f3322294-0ad0-11ec-911a-12bb97331649.png

「条件筛选」

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

# 找到所有steps子节点中orientation为“西”的

jsonpath(demo_json, ‘$..steps[?(@.orientation == “西”)]’)

f340b5e8-0ad0-11ec-911a-12bb97331649.png

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

# 找到所有具有polyline键的节点对应的polyline与road键对应值

jsonpath(demo_json, ‘$.。[?(@.polyline)][polyline,road]’)

f3559148-0ad0-11ec-911a-12bb97331649.png

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

# 获取结果的JSONPath表达式

jsonpath(demo_json, ‘$.。[?(@.polyline)][polyline,road]’, result_type=None)

f3c909b6-0ad0-11ec-911a-12bb97331649.png

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

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87593
  • XML
    XML
    +关注

    关注

    0

    文章

    183

    浏览量

    32936
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83466
  • JSON
    +关注

    关注

    0

    文章

    111

    浏览量

    6815

原文标题:在 Python 中操纵 json 数据的最佳方式

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在PSoC Creator安装GSL

    的,并且仅使用其他方法的一小部分资源。 (在寻找解决方案时,TSQR 并不要求所有数据点都保留在 SRAM 。 除非它也具有此功能,否则请不要建议其他方法。) 我现在想将代码移植到我的 PSoc4 上。 如何在 PSoC Creator
    发表于 01-23 06:22

    数字式保护装置与常规微机保护装置的主要区别有哪些?

    数字式保护装置与常规微机保护装置的主要区别有哪些? 数字式保护装置和常规微机保护装置是电力系统中常用的两种保护装置。它们在原理、功能、性能和应用等方面有很多不同之处。下面我将详细介绍
    的头像 发表于 01-04 10:45 287次阅读

    半孔板比常规pcb板多出什么流程

    半孔板是一种特殊的PCB板,相比于常规的PCB板,它在制造过程中需要多出一些步骤和流程。在本文中,将介绍半孔板相较于常规PCB板所多出的流程。 首先,半孔板的制造流程与常规PCB板的流
    的头像 发表于 12-25 16:13 381次阅读

    天线与馈线连接的2种常规方法介绍

    在安装天线时,天线和馈线的连接至关重要,它与天线的接收效果密切相关。本文将介绍2种常规的天线和馈线连接的安装方式。
    的头像 发表于 11-24 16:01 753次阅读
    天线与馈线连接的2种<b class='flag-5'>常规</b>方法<b class='flag-5'>介绍</b>

    LabVIEWNIPackageManager功能介绍

    LabVIEWPackageManager功能介绍 使用NIPackage Manager可安装、更新、修复和删除NI软件。 安装NI软件使用PackageManager浏览和安装NI软件
    发表于 11-13 18:59

    DVP功能及应用介绍

    数字摄像头并行接口(DVP)用于捕获 CMOS 影像摄像机所输出的并行数据。本文主要就 DVP 功能简介以及应用介绍
    发表于 10-25 06:15

    AT32上的DSP指令与

    DSP Instruction and Library on AT32主要介绍ARM Cortex-M4F的DSP指令、DSP相关库函数以及移植DSP到AT32 MCU的方法,并在最后以具体示例介绍一些库函数在应用
    发表于 10-24 06:59

    ads文件怎么用?

    ads文件怎么用
    发表于 10-17 07:12

    Proteus如何添加STC

    Proteus怎么添加STC,第一次用这个软件,听得比较多,但是没有用过,在百度里面找了一些方法,但是好像没有下载。哪位论坛朋友,如果有,或者有快捷的方法提供一下。
    发表于 10-08 06:24

    如何使用DSP的PID控制器功能

    优势 。 BSP 版本:M480系列BSP CMSIS V3.03.000 硬件: NuMaker-ETM-M487 v1.1 此样本演示了如何使用 DSP 的 PID 控制器功能。 示例中有两种
    发表于 08-31 07:58

    AS950 ARM应用程序员指南

    )·支持使用ADS构建示例所需的实用程序。 还提供了一个通用的C实用程序util_lib来演示每个主要组件。 根据许可协议的条款,您可以自由地将包含的任何源代码合并到任何产品
    发表于 08-18 07:31

    汽车ECU的常规功能模块

    常规功能模块 ① 电源:向ECU内的各模块提供稳定的电压(5V、3V等),且与发动机舱的12V电池连接;也可用于AD转换器的标准电压,可实现较高精度。 ② 输入缓冲器:将数字输入信号转换为可输入
    的头像 发表于 07-14 11:23 572次阅读
    汽车ECU的<b class='flag-5'>常规</b><b class='flag-5'>功能</b>模块

    常规LED显示屏安装方法简述

    常规LED显示屏的安装虽然比较简单,但还是需要有一定的技术基础和动手操作能力,以下是一个常规的LED显示屏安装方法简述,可供大家参考:
    的头像 发表于 06-26 10:52 1685次阅读
    <b class='flag-5'>常规</b>LED显示屏安装方法简述

    编译器如何处理使用预编译SMING文件编译的应用程序未使用的

    我在 ESP8266 上使用 SMING 框架。在 SMING 框架,有许多未使用的。例如,有很多与非 Adafruit 开发板无关的 Adafruit-XXX 。 SMING 框架编译成一个
    发表于 06-12 08:54

    高级定时器的功能介绍

      本文将介绍高级定时器的功能
    的头像 发表于 05-01 09:01 2087次阅读
    高级定时器的<b class='flag-5'>功能</b><b class='flag-5'>介绍</b>