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

    文章

    7010

    浏览量

    88976
  • XML
    XML
    +关注

    关注

    0

    文章

    188

    浏览量

    33081
  • python
    +关注

    关注

    56

    文章

    4795

    浏览量

    84647
  • JSON
    +关注

    关注

    0

    文章

    117

    浏览量

    6963

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

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

收藏 人收藏

    评论

    相关推荐

    HAL和标准的区别 HAL与CMSIS的关系

    在嵌入式系统开发,HAL(硬件抽象层)和标准是两种常用的软件,它们在功能和使用场景上有所不同。 1. 标准
    的头像 发表于 12-02 14:02 448次阅读

    HAL在STM32开发的重要性

    HAL(Hardware Abstraction Layer Library,硬件抽象层)在STM32开发扮演着至关重要的角色。以下是HAL在STM32开发
    的头像 发表于 12-02 13:35 302次阅读

    HAL在嵌入式系统的应用

    HAL(Hardware Abstraction Layer Library,硬件抽象层)在嵌入式系统扮演着至关重要的角色。以下是HAL在嵌入式系统
    的头像 发表于 12-02 11:32 481次阅读

    支持外扩sd卡功能的串口数据模块

    往期文章介绍了LS10串口数据模块的SQL数据库存取功能,片内容量测试如下: 容量测试,分享如下: 表格结构(sn int primary key not null,id int,p1 int
    发表于 11-23 09:50

    LS10串口数据模块外扩SD卡功能

    LS10串口数据模块外扩SD卡功能
    的头像 发表于 11-23 09:42 191次阅读
    LS10串口数据<b class='flag-5'>库</b>模块外扩SD卡<b class='flag-5'>功能</b>

    电动机的常规控制方法

    电动机作为现代工业不可或缺的动力源,其性能的稳定性和控制的精确性直接关系到整个生产过程的效率和安全。因此,电动机的常规控制成为了工业自动化领域的重要研究方向。本文将从电动机的常规控制方法、控制策略、控制系统以及控制技术的发展趋
    的头像 发表于 06-28 18:14 1433次阅读

    利用NVIDIA的nvJPEG2000分析DICOM医学影像的解码功能

    本文将深入分析 DICOM 医学影像的解码功能。AWS HealthImaging 利用 NVIDIA 的 nvJPEG2000 来实现此功能
    的头像 发表于 05-28 14:27 791次阅读
    利用NVIDIA的nvJPEG2000<b class='flag-5'>库</b>分析DICOM医学影像的解码<b class='flag-5'>功能</b>

    数字信号处理DSP文件的使用方法和功能实现

    本文首先介绍数字信号处理(DSP),是指将连续的模拟信号转换为不连续、离散的数字信号并进行处理以提取所需的信号(信息)的过程。然后通过一个简单的Lab来说明DSP文件的使用方法和功能实现。
    的头像 发表于 04-03 14:09 2656次阅读
    数字信号处理DSP<b class='flag-5'>库</b>文件的使用方法和<b class='flag-5'>功能</b>实现

    博途用户自定义的使用-的编辑及管理

    前面两篇文章我们介绍了项目及全局。项目没有单独的存放路径,它随项目创建而创建,随项目保存而保存。全局有单独的存放路径,可被保存、归档
    的头像 发表于 01-24 10:45 1082次阅读
    博途用户自定义<b class='flag-5'>库</b>的使用-<b class='flag-5'>库</b>的编辑及管理

    Proteus元件的电阻元件介绍

    在Proteus元件,电阻元件被称为Resistor。电阻是一种常用的电子元件,用于限制电流流动的能力。它们通常用于各种电路,包括放大电路、滤波电路、稳压电路等等。在本文中,我们将对电阻
    的头像 发表于 01-24 10:11 1w次阅读

    如何在PSoC Creator安装GSL

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

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

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

    Access数据基础知识介绍

    电子发烧友网站提供《Access数据基础知识介绍.pdf》资料免费下载
    发表于 01-02 10:24 3次下载

    mysql怎么新建一个数据

    mysql怎么新建一个数据 如何新建一个数据在MySQL 创建一个数据是MySQL的基本操作之一。下面将详细
    的头像 发表于 12-28 10:01 887次阅读

    宏集方案 | 物联网HMI的关键驱动力—SCADA级功能和控件

    在这个数字化时代,物联网HMI已成为连接人与设备之间的关键纽带,为用户提供直观、智能的交互体验,背后强大的关键驱动力扮演着至关重要的角色,其中SCADA级功能和控件的引入成为了物联网HMI设计和开发的核心要素。
    的头像 发表于 12-26 09:39 512次阅读
    宏集方案 | 物联网HMI的关键驱动力—SCADA级<b class='flag-5'>功能</b><b class='flag-5'>库</b>和控件<b class='flag-5'>库</b>