Python3下利用JsonPath解析数据

前言

常见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..price store的所有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))

作者:wintest
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/wintest/p/14938882.html