在接口测试或别的检测情景中,大家常常必须获得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\": \"NIKE\",
\"intent\": [
\"full\"
]
},
\"rel\": [
{
\"des\": {
\"person_name\": \"皇甫玖林\",
\"political_status\": \"王牌vip会员\"
},
\"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:NIKE
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:王牌vip会员
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 jmespath
result = jmespath.search(\"code\",test_json)
print(result)
# 实行以上代码,导出结论如下所示:
200
Demo2 等级查看某一key的值
import jmespath
result = jmespath.search(\"desc.info\",test_json)
print(result)
# 实行以上代码,导出结论如下所示:
表明
Demo3 根据数据库索引查看Json中List 原素
import jmespath
result = jmespath.search(\"data[0]\",test_json)
print(result)
# 实行以上代码,导出结论如下所示:
{\'apps\': {\'app_op_seq\': [{\'action\': \'点一下\', \'module_name\': \'淘宝聚划算\', \'module_type\': \'resource\'}]}, \'content\': {\'des\': {\'company_name\': \'NIKE\', \'intent\': [\'full\']}, \'rel\': [{\'des\': {\'person_name\': \'皇甫玖林\', \'political_status\': \'王牌vip会员\'}, \'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 jmespath
result = 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]]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。