Python3下利用JsonPath解析数据

摘要:
今天我们将学习一个JSON解析工件:JsonPath,它专门用于解析和提取JSON数据。我的环境:Python 3.7.0和jsonpath0.82JsonPath安装在Python中。为了使用JsonPath解析数据,我们需要安装第三方库。命令如下:pip3installjsonpathJsonPath语法示例使用$表示JsonPath中的根节点,或使用$表示整个JSON数据。当我们在Python中使用jsonpath结合第三方库jsonpath处理JSON数据时,使用方法是:jsonpath.jsonpath。如果成功从数据中提取数据,将返回一个列表,否则将直接返回false。

前言

常见Web接口返回数据的时候,大部分是以 JSON 的形式返回,如果返回数据量不大的话,我们可以直接通过 字典取值正则取值 的方式来直接获取。

但如果接口返回数据量比较大,或者嵌套的层级非常深,这种情况下使用 字典取值 就会变得有点困难;而 正则取值 虽然是万能的方法,但其只针对字符串才能使用。

那么在 Python 中,对于以上情况,有没有更好更方便的方法呢?今天我们就来学习一款JSON解析神器:JsonPath,它是专门用来解析提取JSON数据用的。

本人环境:Python 3.7.0、jsonpath 0.82

JsonPath安装

在 Python 中,为了使用JsonPath来解析数据,我们需要安装第三方库,命令如下:

pip3 install jsonpath

JsonPath语法示例

在 JsonPath 中使用 $ 来表示根节点,或者说使用 $ 来表示整个JSON数据。假如存在以下 data 数据:

{
    "store": {
        "book": [
            {
                "category": "新闻学",
                "author": "张三",
                "title": "图书标题1",
                "price": 8.95
            },
            {
                "category": "金融学",
                "author": "李四",
                "title": "图书标题2",
                "price": 12.00
            },
            {
                "category": "计算机",
                "author": "王五",
                "title": "图书标题3",
                "isbn": "0-553-21311-3",
                "price": 9.99
            },
            {
                "category": "医学",
                "author": "赵六",
                "title": "图书标题4",
                "price": 22.99
            }
        ],
        "phone": {
            "color": "red",
            "price": 1999.00,
            "author": "孙七"
        },
        "author": "周八",
        "price": 1.00
    },
    "author": "吴九"
}

以下是JsonPath的简单语法示例:

JsonPath返回结果
$.store.book[*].author所有book的author
$.author仅子节点下的author
$..author所有节点下的author
$.store.*store的所有元素,包括 book 和 phone
$.store..pricestore的所有price
$..book[2]book的第3个元素
$..book[(@.length - 2)]book的倒数第2个元素
$..book[:2]book的前面2个元素
$..book[-2:]book的最后2个元素
$..book[0,3]book的第1个元素、第4个元素
$..book[?(@.isbn)]book中所有带有 isbn 的元素
$.store.book[?(@.price < 10)]book中所有price小于10的元素
$..*所有元素

注意:使用 JsonPath 时,索引是从 0 开始计算。

jsonpath使用

我们在Python中结合第三方库 jsonpath 来处理JSON数据时,使用方式为:jsonpath.jsonpath(data, jsonpath表达式),如果成功从 data 中提取到数据,那么会返回一个list列表,否则直接返回False。

import jsonpath


data = {
    "store": {
        "book": [
            {
                "category": "新闻学",
                "author": "张三",
                "title": "图书标题1",
                "price": 8.95
            },
            {
                "category": "金融学",
                "author": "李四",
                "title": "图书标题2",
                "price": 12.00
            },
            {
                "category": "计算机",
                "author": "王五",
                "title": "图书标题3",
                "isbn": "0-553-21311-3",
                "price": 9.99
            },
            {
                "category": "医学",
                "author": "赵六",
                "title": "图书标题4",
                "price": 22.99
            }
        ],
        "phone": {
            "color": "red",
            "price": 1999.00,
            "author": "孙七"
        },
        "author": "周八",
        "price": 1.00
    },
    "expensive": 10,
    "author": "吴九"
}


res1 = jsonpath.jsonpath(data, "$.store.book[*].author")
print("所有book的author:{}".format(res1))

res2 = jsonpath.jsonpath(data, "$.store..price")
print("store的所有price:{}".format(res2))

res3 = jsonpath.jsonpath(data, "$..book[0,3]")
print("book的第1个元素、第4个元素:{}".format(res3))

res4 = jsonpath.jsonpath(data, "$.store.book[?(@.price < 10)]")
print("book中所有price小于10的元素:{}".format(res4))

免责声明:文章转载自《Python3下利用JsonPath解析数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nexus deploy时遇到RELEASE does not allow metadata的排查路程十进制,八进制,十六进制,二进制相互转换大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mysql数据表字段设置了默认值,插入数据后默认字段的值却为null,不是默认值

我将mysql的数据表的某个字段设置了默认值为1,当向该表插入数据的时候该字段的值不是默认值,而是null。 我的错误原因: 对数据库的操作我使用了持久化工具mybatis,插入数据的时候插入的是整个实体,直接使用的是持久层的insert(实体对象)方法插入的数据 这样就会出现一个问题,当实体对象中某个属性值为空时,对应的数据库的字段就会插入null值,而...

使用Oracle DBLink进行数据库之间对象的访问操作

Oracle中自带了DBLink功能,它的作用是将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象,例如我们新建了一个数据database1,我们需要操作数据库database2中的表,或者我们需要操作远程机器上数据库database3中的表,我们就可以使用dblink这个强大的功能!1、我们如果要创建全局的D...

vue实战(4):postman测试数据、封装ajax、使用vuex管理状态

书到用时方恨少 这个阶段涉及到了vuex,本来想着不慌,用起来,使用的过程中问题还真不少 本篇涉及到的内容: ---postman 测试数据 ---封装 ajax 请求函数 ---封装接口请求函数 ---使用 vuex 管理状态 ---获取首页相关数据 0. 其它 vue实战(1):准备与资料整理vue实战(2):初始化项目、搭建底部导航路由vue实战...

数据仓库开发——Kettle使用示例

Kettle是一个开园ETL工具,做数据仓库用Spoon。 工具:下载Spoon,解压即可用 1、认识常用组件: 表输入 插入\更新 数据同步 文本文件输出 更新 自动文档输出 表输出 列转行 增加常量 增加序列 排序记录 行转列 过滤记录 数据库连接 合并记录 排序合并 记录关联(笛卡尔输出) 记录集连接 分组 在内存中分组 2、第一个例子 生成 10...

单表千亿电信大数据场景,使用Spark+CarbonData替换Impala案例

【背景介绍】 国内某移动局点使用Impala组件处理电信业务详单,每天处理约100TB左右详单,详单表记录每天大于百亿级别,在使用impala过程中存在以下问题: 详单采用Parquet格式存储,数据表使用时间+MSISDN号码做分区,使用Impala查询,利用不上分区的查询场景,则查询性能比较差。 在使用Impala过程中,遇到很多性能问题(比如ca...

Android批量插入数据到SQLite数据库

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。   有时需要把一些数据内置到应用中,常用的有以下2种方式:其一直接拷贝制作好的SQLite数据库文件,其二是使用系统提供的数据库,然...