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