美文网首页PythonPython
Python3下利用JsonPath解析数据

Python3下利用JsonPath解析数据

作者: wintests | 来源:发表于2021-06-26 20:14 被阅读0次

    前言

    常见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))
    

    相关文章

      网友评论

        本文标题:Python3下利用JsonPath解析数据

        本文链接:https://www.haomeiwen.com/subject/qsczmctx.html