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

    文章

    7193

    浏览量

    89818
  • XML
    XML
    +关注

    关注

    0

    文章

    188

    浏览量

    33153
  • python
    +关注

    关注

    56

    文章

    4811

    浏览量

    85102
  • JSON
    +关注

    关注

    0

    文章

    119

    浏览量

    7035

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

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

收藏 人收藏

    评论

    相关推荐

    Oracle数据的多功能集成开发环境

    Oracle数据的多功能集成开发环境 快捷菜单的可视化对象编辑器 上下文感知的SQL代码补全、智能格式化和重构 逐步执行的自动调试功能功能
    的头像 发表于 01-14 13:52 138次阅读
    Oracle数据<b class='flag-5'>库</b>的多<b class='flag-5'>功能</b>集成开发环境

    云数据是哪种数据类型?

    云数据是一种部署在虚拟计算环境的数据,它融合了云计算的弹性和可扩展性,为用户提供高效、灵活的数据服务。云数据主要分为两大类:关系型
    的头像 发表于 01-07 10:22 161次阅读

    腾讯ima升级知识功能,上线小程序实现共享与便捷问答

    近日,腾讯旗下的AI智能工作台ima.copilot(简称ima)迎来了知识功能的重大升级。此次升级不仅增加了“共享知识”的新能力,还正式上线了“ima知识”小程序,为用户带来了
    的头像 发表于 12-31 15:32 649次阅读

    Java 23功能介绍

    功能。 跟上 Java 新版本的发布节奏可能很难,这意味着要解决一连串的问题——更改是什么、为什么要更改以及如何使用全新和更新的功能。 在这篇博文中,我将介绍 Java 23 的一些全新和更新
    的头像 发表于 12-04 10:02 392次阅读
    Java 23<b class='flag-5'>功能</b><b class='flag-5'>介绍</b>

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

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

    HAL在STM32开发的重要性

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

    HAL在嵌入式系统的应用

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

    支持外扩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 271次阅读
    LS10串口数据<b class='flag-5'>库</b>模块外扩SD卡<b class='flag-5'>功能</b>

    Python解析:通过实现代理请求与数据抓取

    在Python,有多个可以帮助你实现代理请求和数据抓取。这些提供了丰富的功能和灵活的API,使得你可以轻松地发送HTTP请求、处理响应、解析HTML/XML/JSON数据,以及进
    的头像 发表于 10-24 07:54 242次阅读

    软件系统数据的分库分表设计

    的分布式集群,实现分库分表功能,解决数据中海量数据存储和查询性能的问题。MyCat 还是一个数据的集群中间件,主要实现 RDBMS 数据集群的故障转移、负载均衡、读写分离等
    的头像 发表于 08-22 11:39 383次阅读
    软件系统数据<b class='flag-5'>库</b>的分库分表设计

    电动机的常规控制方法

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

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

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

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

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

    纳芯微带保护功能的单通道隔离驱动NSI6611在电控系统的运用介绍

    主驱电控系统是新能源汽车的重要组成部分,本文将从电控系统的系统框图出发,介绍系统的各组成部分及其功能,并重点介绍纳芯微带保护功能的单通道隔离驱动NSI6611在电控系统
    的头像 发表于 03-18 09:51 3794次阅读
    纳芯微带保护<b class='flag-5'>功能</b>的单通道隔离驱动NSI6611在电控系统<b class='flag-5'>中</b>的运用<b class='flag-5'>介绍</b>