js获取json中的某个值(两个字符串比较)
程序员文章站
2024-03-27 14:34:34
在接口测试或其他测试场景中,我们经常需要获取json中的某路径下的值进行校验,即从json中抽取指定信息。本文主要介绍满足该需求的python jmespath库,除此之外还有jsonpath,有兴趣...
在接口测试或其他测试场景中,我们经常需要获取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 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': '耐克', '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 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]]