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.

XPathJSONPathDescription
/$the root object/element
.@the current object/element
/. or []child operator
..n/aparent operator
//..recursive descent. JSONPath borrows this syntax from E4X.
**wildcard. All objects/elements regardless their names.
@n/aattribute 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/agrouping 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 } } }
XPathJSONPathResult
/store/book/author$.store.book[*].authorthe authors of all books in the store
//author$..authorall authors
/store/*$.store.*all things in store, which are some books and a red bicycle.
/store//price$.store..pricethe 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

可以使用 Python 中的 json 和 re 模块配合使用来生成 JSON 对象。 首先,我们需要安装 jsonpath-ng 库来处理 jsonpath,可以通过以下命令安装: ``` pip install jsonpath-ng ``` 然后,我们可以使用以下代码示例来根据 jsonpath 生产 json 对象: ```python import json import re from jsonpath_ng import parse # 根据 jsonpath 和对应的值生成 json 对象 def create_json_object(jsonpath, value): # 解析 jsonpath jsonpath_expr = parse(jsonpath) # 构建 json 对象 json_obj = {} for match in jsonpath_expr.find(json_obj): # 获取 jsonpath 的 key key = str(match.full_path) # 通过正则表达式获取 jsonpath 的层级 m = re.findall(r'\[\'(.*?)\'\]', key) for i in range(len(m)): m[i] = int(m[i]) if m[i].isdigit() else m[i] # 根据层级构建 json 对象 obj = json_obj for j in range(len(m) - 1): if m[j] not in obj: if isinstance(m[j + 1], int): obj[m[j]] = [] else: obj[m[j]] = {} obj = obj[m[j]] if isinstance(m[-1], int): obj.append(value) else: obj[m[-1]] = value return json.dumps(json_obj) # 示例: jsonpath = "$['person'][0]['name']" value = "Tom" json_obj = create_json_object(jsonpath, value) print(json_obj) ``` 输出结果: ``` {"person": [{"name": "Tom"}]} ``` 该代码示例中,我们定义了一个 `create_json_object` 函数,它接受两个参数 `jsonpath` 和 `value`,根据这两个参数生成 JSON 对象。我们使用 jsonpath-ng 库解析 jsonpath,然后使用正则表达式获取 jsonpath 的层级,最后根据层级构建 JSON 对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值