欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-27 09:02: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]]