zoukankan      html  css  js  c++  java
  • 转 使用jsonpath解析多层嵌套的json响应信息

    Python自带的json库可以把请求转为字典格式, 但在多层嵌套的字典中取值往往要进行多次循环遍历才能取到相应的数据, 如:

    res_dict = {
        "code": 0,
        "msg": "成功",
        "data": {
            "users": [
                {"name": "张三", "gender": "male", "age": 12},
                {"name": "李四", "gender": "female", "age": 15},
                {"name": "王五", "gender": "male", "age": 22},
                {"name": "赵六", "gender": "male", "age": 24},
            ],
            "goods": [
                {"name": "apple", "price": 15, "num": 200},
                {"name": "pear", "price": 18, "num": 100},
                {"name": "banana", "price": 16, "num": 210},
            ]
        } 
    }
    1. 获取所有用户名?
    2. 如果users是动态的(有可能是users123,或users567)怎么获取下面的数据?
    3. 怎么快说获取年龄大于20的用户?

    这种类型的操作用字典遍历往往就麻烦的多, 特别是遇到动态节点更是无从下手
    jsonpath则可以很好的解决这个问题。

    主要特点

    • 支持路径及*模糊匹配
    • 支持索引和类似切片功能
    • 支持表达式筛选

    jsonpath安装

    Copy
    pip install jsonpath
    

    jsonpath基本语法

    jsonpath语法

    jsonpath使用示例

    Copy
    from jsonpath import jsonpath
    
    res_dict = {
        "code": 0,
        "msg": "成功",
        "data": {
            "users": [
                {"name": "张三", "gender": "male", "age": 12},
                {"name": "李四", "gender": "female", "age": 15},
                {"name": "王五", "gender": "male", "age": 22},
                {"name": "赵六", "gender": "male", "age": 24},
            ],
            "goods": [
                {"name": "apple", "price": 15, "num": 200},
                {"name": "pear", "price": 18, "num": 100},
                {"name": "banana", "price": 16, "num": 210},
            ]
        } 
    }
    
    # 匹配结果为一个列表, 无结果返回False
    # 1. 逐级取值, 可使用*代表任意节点 .. 表示任意路径
    print(jsonpath(res_dict, "$.msg"))  
    print(jsonpath(res_dict, "$.data.*"))  # data下的任意节点(users/goods)下的数据
    print(jsonpath(res_dict, "$.data..[2]")  # 任意节点(包含users和goods)下的第3个
    print(jsonpath(res_dict, "$..users[*].name"))
    
    # 2. 索引和切片
    print(jsonpath(res_dict, "$.data.users[2]"))  # 第三个数据
    print(jsonpath(res_dict, "$.data.users[0:2]")) # 前两条数据
    
    # 表达式
    print(jsonpath(res_dict, "$..users[?(@.gender=='female')]"))  # 支持和当前数据中的字段比较
    

    更多学习资料请加添加作者微信:lockingfree获取

    作者: 韩志超

    出处:https://www.cnblogs.com/superhin/p/11454968.html

    版权:本文采用「欢迎转载-请注明出处」知识共享许可协议进行许可

  • 相关阅读:
    集合操作
    聚合函数
    图存储3-十字链表
    图存储2-邻接表
    图存储1 临接矩阵
    字符串逆序,字符串翻转
    读写文件
    加密算法
    静态变量-动态变量
    【Qt】UserDefindeControl
  • 原文地址:https://www.cnblogs.com/python-xiakaibi/p/13300849.html
Copyright © 2011-2022 走看看