在接口测试或其他测试场景中,我们经常需要获取JSON中的某路径下的值进行校验,即从JSON中抽取指定信息。

本文主要介绍满足该需求的Python jmespath库,除此之外还有Jsonpath,有兴趣的可以自行了解。

安装

pip install jmespath

代码示例

我们以下面test_json 这个较为复杂的Json对象为示例。

test_json = {  "code": 200,  "desc": {    "info":"说明",    "update":"3月6日"   },  "data": &[     {      "apps": {        "app_op_seq": &[           {            "action": "点击",            "module_name": "聚划算",            "module_type": "resource"           }         ]       },      "content": {        "des": {          "company_name": "耐克",          "intent": &[            "full"           ]         },        "rel": &[           {            "des": {              "person_name": "欧阳玖林",              "political_status": "金牌会员"             },            "ont": &[               {                "name":"Person",                "id":1               },               {                "name":"Company",                "id":2               },               {                "name":"Car",                "id":3               }             ],            "relIdx": &[              0,              "8-9"             ],            "relName": "欧阳",            "segs": &[              "耐克篮球鞋"             ]           }         ],        "segs": &[          "耐克篮球鞋"         ]       },      "content_op": "查询"     }   ]}

我们先用之前文章中介绍的自研 《Python 实现 JSON、字典数据结构的递归解析》 代码,解析上述 JSON对象,解析结果如下:

1 JsonPath:code  Value:200 2 JsonPath:desc.info  Value:说明 3 JsonPath:desc.update  Value:3月6日 4 JsonPath:data&[0].apps.app_op_seq&[0].action  Value:点击 5 JsonPath:data&[0].apps.app_op_seq&[0].module_name  Value:聚划算 6 JsonPath:data&[0].apps.app_op_seq&[0].module_type  Value:resource 7 JsonPath:data&[0].content.des.company_name  Value:耐克 8 JsonPath:data&[0].content.des.intent&[0]  Value:full 9 JsonPath:data&[0].content.rel&[0].des.person_name  Value:欧阳玖林 10 JsonPath:data&[0].content.rel&[0].des.political_status  Value:金牌会员 11 JsonPath:data&[0].content.rel&[0].ont&[0].name  Value:Person 12 JsonPath:data&[0].content.rel&[0].ont&[0].id  Value:1 13 JsonPath:data&[0].content.rel&[0].ont&[1].name  Value:Company 14 JsonPath:data&[0].content.rel&[0].ont&[1].id  Value:2 15 JsonPath:data&[0].content.rel&[0].ont&[2].name  Value:Car 16 JsonPath:data&[0].content.rel&[0].ont&[2].id  Value:3 17 JsonPath:data&[0].content.rel&[0].relIdx&[0]  Value:0 18 JsonPath:data&[0].content.rel&[0].relIdx&[1]  Value:8-9 19 JsonPath:data&[0].content.rel&[0].relName  Value:欧阳 20 JsonPath:data&[0].content.rel&[0].segs&[0]  Value:耐克篮球鞋 21 JsonPath:data&[0].content.segs&[0]  Value:耐克篮球鞋 22 JsonPath:data&[0].content_op  Value:查询 Process finished with exit code 0

Demo1 查询某个key的值

import jmespathresult = jmespath.search("code",test_json)print(result)# 执行上述代码,输出结果如下:200

Demo2 层级查询某个key的值

import jmespathresult = jmespath.search("desc.info",test_json)print(result)# 执行上述代码,输出结果如下:说明

Demo3 通过索引查询Json中List 元素

import jmespathresult = jmespath.search("data&[0]",test_json)print(result)# 执行上述代码,输出结果如下:{'apps': {'app_op_seq': &[{'action': '点击', 'module_name': '聚划算', 'module_type': 'resource'}]}, 'content': {'des': {'company_name': '耐克', 'intent': &['full']}, 'rel': &[{'des': {'person_name': '欧阳玖林', 'political_status': '金牌会员'}, 'ont': &[{'name': 'Person', 'id': 1}, {'name': 'Company', 'id': 2}, {'name': 'Car', 'id': 3}], 'relIdx': &[0, '8-9'], 'relName': '欧阳', 'segs': &['耐克篮球鞋']}], 'segs': &['耐克篮球鞋']}, 'content_op': '查询'}

Demo4 复杂层级查询某个key的值

import jmespathresult = jmespath.search("data&[0].apps.app_op_seq&[0].action",test_json)print(result)# 执行上述代码,输出结果如下:点击

通过上述查询方式,我们基本也能看出,在取列表值时用的 &“[]&”,取字典值时用的 &“.&”,来表示路径层级 。

Demo5 对Json中List进行切片查询

import jmespath# 获取relIdx下第0、1个元素 result = jmespath.search("data&[0].content.rel&[0].relIdx&[0:2]",test_json)print(result)# 获取relIdx下全部元素 relIdx&[*]result1 = jmespath.search("data&[0].content.rel&[0].relIdx&[*]",test_json)print(result1)# 执行上述代码,输出结果如下:&[0, '8-9']&[0, '8-9']

Demo6 其他用法

import jmespath# 批量获取Json中List的字典元素的某个Key的值result = jmespath.search("data&[0].content.rel&[0].ont&[0:3].name",test_json)print(result)# 批量获取Json中List的字典元素的多个Key的值result1 = jmespath.search("data&[0].content.rel&[0].ont&[0:3].&[name,id]",test_json)print(result2)# 执行上述代码,输出结果如下:&['Person', 'Company', 'Car']&[&['Person', 1], &['Company', 2], &['Car', 3]]

www.tstingmi.com 提供内容。