zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    python基础----装饰器
    python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
    python基础----文件处理
    python基础
    django时间的时区问题
    django-admin详细设置
    Django框架-模板系统
    Django框架--路由分配系统
    jQuery教程
    django博客项目11
  • 原文地址:https://www.cnblogs.com/wintest/p/14938882.html
Copyright © 2011-2022 走看看