zoukankan      html  css  js  c++  java
  • json解析神器--jsonpath

    做自动化测试的过程中,如果返回的json层级较多,取值会相对来说比较麻烦,经常使用的取值方式就是:

    1.按照固定的层级,一级一级的进行查找

    2.使用正则表达式

    3.也可以使用jsonpath进行查找----相对来说比较方便的一种方式

    jsonpath详细解说:

    1.首先安装jsonpath依赖包-------pip install jsonpath

    2.jsonpath 表达式讲解

    xpath jsonpath 描述
    / $ 根节点
    . @ 现行节点
    / .或者[] 取子节点
    .. n/a 取父节点(jsonpath不支持)
    // .. 相对节点,不管位置,选择所有符合条件的条件
    * * 匹配所有元素节点
    [] [] 迭代器标示(可以在里面做简单的迭代操作,如,数组下标、根据内容选值)
    &#124 [,] 支持迭代器中做多选
    [] ?() 支持过滤操作
    n/a () 支持表达式操作
    () n/a 分组,jsonpath不支持

    使用方法:

    $ 符,是查找的根节点,传入的参数是Python的dict类型,如果查到对应的结果,则返回为list结果,如果未查找到对应的结果,返回False

    $.是取子节点,如果不在当前节点,可以使用 $.. 相对节点取值,取出所有满足要求的子孙节点

    实践方法如下:

    import jsonpath
    
    result = {
        "code": 0,
        "data": [
            {
                "age": 20,
                "create_time": "2020-12-12",
                "id": 1,
                "mail": "7048667795@qq.com",
                "name": "mini",
                "sex": "W"
            },
            {
                "age": 21,
                "create_time": "2019-12-16",
                "id": 2,
                "mail": "23233232323@qq.com",
                "name": "mini12",
                "sex": "M"
            }
        ],
        "msg": "success!"
    }
    
    
    #$.  -->表示的意思:根节点下的子节点msg,所以输出结果为:success!
    msg = jsonpath.jsonpath(result, '$.msg')
    print(msg)   # 输出结果 ['success!']
    #$..  -->表示的意思:根节点下的相对节点(也就是不管位置,选择所有符合条件的条件)-->输出结果是以列表的形式进行存储
    names = jsonpath.jsonpath(result, '$..name')
    print(names)   # 输出结果 ['mini', 'mini12']
    #$..  -->表示的意思:根节点下的相对节点(也就是不管位置,选择所有符合条件的条件)-->如果未查找到相关的内容,则会返回False
    no = jsonpath.jsonpath(result, '$..mini13')
    print(no)   # 找不到是结果是 False

    list列表取值

    import jsonpath
    rep={
    "code": 0, "msg": "success!", "data": [{ "id": 154, "create_time": "2021-01-20 22:38:16", "update_time": "2021-01-20 22:38:16", "goodsname": "《selenium入门到精通到放弃》", "goodscode": "sp_210001", "merchantid": "", "merchantname": "", "goodsprice": 20.0, "stock": 0, "goodsgroupid": 0, "goodsstatus": 1 }, { "id": 1, "create_time": "2021-01-17 15:14:25", "update_time": "2021-01-20 22:21:51", "goodsname": "《jmeter 入门到精通》", "goodscode": "sp_100049", "merchantid": "10001", "merchantname": "悠悠学堂", "goodsprice": 100.0, "stock": 1, "goodsgroupid": 1, "goodsstatus": 1 }, { "id": 150, "create_time": "2021-01-19 23:43:47", "update_time": "2021-01-19 23:43:47", "goodsname": "《cypress 入门到精通》", "goodscode": "sp_10002232", "merchantid": "1000122", "merchantname": "悠悠学堂", "goodsprice": 49.9, "stock": 100, "goodsgroupid": 0, "goodsstatus": 1 }, { "id": 148, "create_time": "2021-01-19 23:42:20", "update_time": "2021-01-19 23:42:20", "goodsname": "《appium 入门到精通》", "goodscode": "sp_426001", "merchantid": "42601", "merchantname": "悠悠学堂", "goodsprice": 99.9, "stock": 100, "goodsgroupid": 0, "goodsstatus": 1 }, { "id": 147, "create_time": "2021-01-19 22:22:41", "update_time": "2021-01-19 22:22:41", "goodsname": "《pytest 入门到精通》", "goodscode": "sp_100119", "merchantid": "", "merchantname": "", "goodsprice": 10.0, "stock": 0, "goodsgroupid": 0, "goodsstatus": 1 }] }

    1.根据下标,取出列表中的第一组值

    data1=jsonpath.jsonpath(rep,'$.data[0]')
    print(data0)
    
    输出结果:
    [{'id': 154, 'create_time': '2021-01-20 22:38:16', 'update_time': '2021-01-20 22:38:16', 'goodsname': '《selenium入门到精通到放弃》', 'goodscode': 'sp_210001', 'merchantid': '', 'merchantname': '', 'goodsprice': 0.0, 'stock': 0, 'goodsgroupid': 0, 'goodsstatus': 1}]

    2.取出第一组数据里面的goodscode

    goodscode_data2=jsonpath.jsonpath(rep,'$.data[0].goodscode')
    print(goodscode)
    
    输出结果:
    ['《selenium入门到精通到放弃》']

    3.取出data里面的前三条条数据,可以使用list切片的方法进行取值

    data_3=jsonpath.jsonpath(rep,'$.data[:3]')
    print(data_03)

    4.取出data里面的后两条数据,可以使用list切片的方式进行取值

    data4=jsonpath.jsonpath(rep,'$.data[-2:]')
    print(data-02)

    5.取出data里面,倒数第二个数据,可以使用list切片进行取值   list[-2:-1]

    data5=jsonpath.jsonpath(rep,'$.data[-2:-1]')
    print(data4)

    6.取出data里面,第一条和第三条数据,可以使用list切片进行取值  list[0,2]

    data6=jsonpath.jsonpath(rep,'$.data[0,2]')
    print(data5)

    ?()过滤器运算符

    过滤器是用于筛选数组的逻辑表达式,一个典型的过滤器,[?(@.age>12)],其中@表示正在处理的当前项目

    可以使用逻辑运算符,创建更复杂的过滤器,字符串文字必须用单引号或者双引号括起来

    操作符 描述
    == 等于(注意:1不等于'1')
    != 不等于
    > 大于
    >= 大于等于
    < 小于
    <= 小于等于
    =~ 匹配正则表达式[?(@.name=~/foo.*?/i)]
    in 左边存在于右边[?(@.size in ['S','M'])]
    nin 左边不存在于右边
    size 长度(数组或字符串)
    empty 为空(数组或字符串)

    ?()过滤表达式的使用

    ?()过滤表达式。表达式必须求值为一个布尔值,表达式一般结合@获取当前节点来过滤

    1.找出商品价格大于30的全部商品信息

    #价格大于30的
    data1=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)]')
    print(data1)
    
    #价格大于30的goodscode
    data2_goodscode=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)].goodscode')
    print(data2_goodscode)
    输出结果:
    ['sp_100049', 'sp_10002232', 'sp_426001']
    
    #价格大于30的goodsname
    data3_goodsname=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)].goodsname')
    print(data3_goodsname)
    输出结果:
    ['《jmeter 入门到精通》', '《cypress 入门到精通》', '《appium 入门到精通》']

    2.取出 'goodscode': 'sp_100049' 对应的 goodsname

    name=jsonpath.jsonpath(req,'$.data[?(@.goodscode == 'sp_100049')].goodsname')
    print(name)
    输出结果:
    ['《jmeter 入门到精通》']

    3.取出 'goodscode': 'sp_100049' 和 'goodscode': 'sp_100119' 对应的 goodsname

    #in 包含在内  nin不存在
    name2=jsonpath.jsonpath(req,'$.data[?(@.goodscode in ["sp_100049", "sp_100119"])].goodsname')
    print(name2)
    输出结果:
    ['《jmeter 入门到精通》', '《pytest 入门到精通》']
  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/lucky1212/p/14356289.html
Copyright © 2011-2022 走看看