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 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]]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至624739273@qq.com举报,一经查实,本站将立刻删除。
Like (0)
柳的头像

相关推荐

发表回复

Please Login to Comment
微信
微信
SHARE
TOP
要想花得少,就用购宝。话费电费9折起,官方公众号:购宝