jsonpath 处理json对象

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

 

 python 种使用 jsonpath :https://www.cnblogs.com/Zhan-W/p/15650408.html

 

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

 
posted @ 2020-05-28 23:17  DeyouKong  阅读(566)  评论(0编辑  收藏  举报