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 入门到精通》']
  • 相关阅读:
    关于智能本质的思考
    Effective C++ 条款39
    【视频教程】JEECG 入门视频教程大全+历史版本号代码下载
    HDU 4859(Bestcoder #1 1003)海岸线(网络流之最小割)
    最简单的基于FFMPEG的音频编码器(PCM编码为AAC)
    android经常使用的电话操作
    Vmware中为Mac Os安装vmtools
    win10.10 激活
    VM11安装Mac OS X 10.10
    win7系统升家庭版级为旗舰版的方法
  • 原文地址:https://www.cnblogs.com/lucky1212/p/14356289.html
Copyright © 2011-2022 走看看