js获取json中的某个值(两个字符串比较)
当前位置:首页 > 综合 > 知识

js获取json中的某个值(两个字符串比较)

  • 高吴
  • 知识
  • 2022-10-21 03:17:22
  • 7
买贴 | 修改  | 投诉  | 刷新  | 

在接口测试或其他测试场景中,我们经常需要获取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]]