js获取json中的某个值(两个字符串比较)
在接口测试或其他测试场景中,我们经常需要获取JSON中的某路径下的值进行校验,即从JSON中抽取指定信息。
本文主要介绍满足该需求的Python jmespath库,除此之外还有Jsonpath,有兴趣的可以自行了解。
安装
pip install jmespath
代码示例
我们以下面test_json 这个较为复杂的Json对象为示例。
test_json = { "code": 200, "desc": { "info":"说明", "update":"2021年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:2021年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]]
原创文章,作者:admin,如若转载,请注明出处:https://www.qq65hfghe5.com/tg/143481.html