zoukankan      html  css  js  c++  java
  • jsonpath-rw处理json对象

    接口自动化测试中,存在依赖情况:test_04的某个请求参数的值依赖test_03返回结果中的某个字段的数据,所以就需要拿到返回数据中特定字段的值。这里使用到python中的jsonpath-rw库

    1、下载安装

    pip install jsonpath-rw

    2、导入

    from jsonpath_rw import jsonpath,parse

    3、例子介绍

    1.返回的match数据

    jsonpath_expr = parse('addCar.product')
    data = {'addCar':{'product': [{'id': '1','price':'38'}, {'id': '32','price':'19'}]}}
    print([match for match in jsonpath_expr.find(data)])
    
    运行结果:[DatumInContext(value=[{'id': '1', 'price': '38'}, {'id': '32', 'price': '19'}], path=Fields('product'), context=DatumInContext(value={'product': [{'id': '1', 'price': '38'}, {'id': '32', 'price': '19'}]}, path=Fields('addCar'), context=DatumInContext(value={'addCar': {'product': [{'id': '1', 'price': '38'}, {'id': '32', 'price': '19'}]}}, path=This(), context=None)))]

    2.获取匹配的数据match.value

    from jsonpath_rw import jsonpath,parse
    data = {"addCar": {"product": [{"id": "1","price": "38"},{"id": "32", "price": "19"},]}}
    jsonpath_expr = parse("addCar.product")
    result = [match.value for match in jsonpath_expr.find(data)]
    print(result)
    运行结果: [[{'id': '1', 'price': '38'}, {'id': '32', 'price': '19'}]]

    3.获取价格

    from jsonpath_rw import jsonpath,parse
    
    data = {"addCar": {"product": [{"id": "1","price": "38"},{"id": "32", "price": "19"},]}}
    jsonpath_expr = parse("addCar.product[*].price")
    result = [match.value for match in jsonpath_expr.find(data)]
    print(result)
    
    运行结果: ['38', '19']

    官方实例

    1.提取值

    result = [match.value for match in jsonpath_expr.find({'foo':[{'baz':1}, {'baz':2}]})]
    print(result)
    
    >>>[1, 2]
    

    2.获取匹配值对应的路径

    from jsonpath_rw import jsonpath,parse
    jsonpath_expr = parse('foo[*].baz')
    result = [str(match.full_path) for match in jsonpath_expr.find({'foo': [{'baz': 1}, {'baz': 2}]})]
    print(result)
    
    >>>['foo.[0].baz', 'foo.[1].baz']
    

    3.自动提供id

    from jsonpath_rw import jsonpath,parse
    result = [match.value for match in parse('foo[*].id').find({'foo': [{'id': 'bizzle'}, {'baz': 3}]})]
    print(result)
    
    >>>['bizzle']
    
    jsonpath.auto_id_field = 'id'
    result = [match.value for match in parse('foo[*].id').find({'foo': [{'id': 'bizzle'}, {'baz': 3}]})]
    
    print(result)
    
    >>>['foo.bizzle', 'foo.[1]']
    

    4.扩展功能之一 命名操作符 `parent`

    result = [match.value for match in parse('a.*.b.`parent`.c').find({'a': {'x': {'b': 1, 'c': 'number one'}, 'y': {'b': 2, 'c': 'number two'}}})]
    print(result)
    
    >>>['number one', 'number two']
    

    更多请查看参考连接

     

    [edit] [comment] [remove] |2007-08-17| e2 # JSONPath expressions

    JSONPath expressions always refer to a JSON structure in the same way as XPath expression are used in combination with an XML document. Since a JSON structure is usually anonymous and doesn't necessarily have a "root member object" JSONPath assumes the abstract name $ assigned to the outer level object.

    JSONPath expressions can use the dot–notation

    $.store.book[0].title

    or the bracket–notation

    $['store']['book'][0]['title']

    for input pathes. Internal or output pathes will always be converted to the more general bracket–notation.

    JSONPath allows the wildcard symbol * for member names and array indices. It borrows the descendant operator '..' from E4X and the array slice syntax proposal [start:end:step] from ECMASCRIPT 4.

    Expressions of the underlying scripting language (<expr>) can be used as an alternative to explicit names or indices as in

    $.store.book[(@.length-1)].title

    using the symbol '@' for the current object. Filter expressions are supported via the syntax ?(<boolean expr>) as in

    $.store.book[?(@.price < 10)].title

    Here is a complete overview and a side by side comparison of the JSONPath syntax elements with its XPath counterparts.

    XPath JSONPath Description
    / $ the root object/element
    . @ the current object/element
    / . or [] child operator
    .. n/a parent operator
    // .. recursive descent. JSONPath borrows this syntax from E4X.
    * * wildcard. All objects/elements regardless their names.
    @ n/a attribute access. JSON structures don't have attributes.
    [] [] subscript operator. XPath uses it to iterate over element collections and for predicates. In Javascript and JSON it is the native array operator.
    | [,] Union operator in XPath results in a combination of node sets. JSONPath allows alternate names or array indices as a set.
    n/a [start:end:step] array slice operator borrowed from ES4.
    [] ?() applies a filter (script) expression.
    n/a () script expression, using the underlying script engine.
    () n/a grouping in Xpath

    XPath has a lot more to offer (Location pathes in not abbreviated syntax, operators and functions) than listed here. Moreover there is a remarkable difference how the subscript operator works in Xpath and JSONPath.

    • Square brackets in XPath expressions always operate on the node set resulting from the previous path fragment. Indices always start by 1.
    • With JSONPath square brackets operate on the object or array addressed by the previous path fragment. Indices always start by 0.
     

    [edit] [comment] [remove] |2007-08-18| e3 # JSONPath examples

    Let's practice JSONPath expressions by some more examples. We start with a simple JSON structure built after an XML example representing a bookstore (original XML file).

    { "store": {
        "book": [ 
          { "category": "reference",
            "author": "Nigel Rees",
            "title": "Sayings of the Century",
            "price": 8.95
          },
          { "category": "fiction",
            "author": "Evelyn Waugh",
            "title": "Sword of Honour",
            "price": 12.99
          },
          { "category": "fiction",
            "author": "Herman Melville",
            "title": "Moby Dick",
            "isbn": "0-553-21311-3",
            "price": 8.99
          },
          { "category": "fiction",
            "author": "J. R. R. Tolkien",
            "title": "The Lord of the Rings",
            "isbn": "0-395-19395-8",
            "price": 22.99
          }
        ],
        "bicycle": {
          "color": "red",
          "price": 19.95
        }
      }
    }
    XPath JSONPath Result
    /store/book/author $.store.book[*].author the authors of all books in the store
    //author $..author all authors
    /store/* $.store.* all things in store, which are some books and a red bicycle.
    /store//price $.store..price the price of everything in the store.
    //book[3] $..book[2] the third book
    //book[last()] $..book[(@.length-1)]
    $..book[-1:]
    the last book in order.
    //book[position()<3] $..book[0:1]
    $..book[:2]
    the first two books
    //book[isbn] $..book[?(@.isbn)] filter all books with isbn number
    //book[price<10] $..book[?(@.price<10)] filter all books cheapier than 10
    //* $..* all Elements in XML document. All members of JSON structure.
     

     上面是JSONPATH和XPath的一些对比,亲自试了几个,标黄的几个没跑通,大家可以在下面探讨一下

    文章搬自:

    https://www.cnblogs.com/exmyth/p/6170439.html

    https://www.cnblogs.com/exmyth/p/6170867.html

     
  • 相关阅读:
    SMR磁盘学习1
    练笔-字符串,向量和数组6
    练笔-字符串,向量和数组5
    练笔-字符串,向量和数组4
    练笔-字符串,向量和数组3
    练笔--字符串,向量和数组2
    Redis系列-存储篇hash主要操作函数小结
    Redis系列-存储篇string主要操作函数小结
    Redis系列-远程连接redis并给redis加锁
    Pjax的使用
  • 原文地址:https://www.cnblogs.com/DeryKong/p/12983400.html
Copyright © 2011-2022 走看看