(9)json包与jsonpath的使用

目录

一、json

作用:

使用:

二、jsonpath

作用:

安装:

使用:

一、json

作用:

主要用来处理python中的json

使用:

import json
    
# 原始变量为dict类型
test_dict = {"key1": "val1", "key2": None, "key3": "True", "key4": "False"}
print(type(test_dict))
# <class 'dict'>


# 转成json_str格式
test_json = json.dumps(test_dict)
print(type(test_json), test_json)
# <class 'str'> {"key1": "val1", "key2": null, "key3": "True", "key4": "False"}


# 将json_str格式转成字典,即python对象
test_dict1 = json.loads(test_json)
print(type(test_dict1), test_dict1)
# <class 'dict'> {'key1': 'val1', 'key2': None, 'key3': 'True', 'key4': 'False'}

二、jsonpath

作用:

从接口响应结果中提取数据,用与其他接口

只能处理json格式的数据(python中只能处理dict)

安装:

pip install jsonpath==0.82

使用:

示例代码:

user_info = {"technology":
    {"python": [
        {"name": "张三",
         "sex": "男",
         "age": 30,
         "height": 175,
         "info": "python工程师"
         },
        {"name": "李四",
         "sex": "男",
         "age": 28,
         "height": 185,
         "info": "python工程师"
         },
        {"name": "小花",
         "sex": "女",
         "age": 18,
         "height": 170,
         "info": "python工程师"
         },
        {"name": "王五",
         "sex": "男",
         "age": 28,
         "height": 185,
         "info": "python开发工程师"
         },
        {"name": "赵六",
         "sex": "男",
         "age": 28,
         "height": 190,
         "info": "python开发工程师"
         }
    ],
        "java": {
            "name": "钱七",
            "sex": "男",
            "age": 30,
            "height": 185.5,
            "info": "java开发工程师"
        }
    }
}

1、$表示根元素(重点,后期会经常使用)

2、. 表示子元素

import pprint

# 导入jsonpath类
from jsonpath import jsonpath

# 输出根元素下边technology的所有内容
res = jsonpath(user_info, "$.technology")
# 这里用pprint,是因为输出的数据结构比较复杂、数据长度较长
pprint.pprint(res)
# 输出的是一个列表
# [{'java': {'age': 30,
#            'height': 185.5,
#            'info': 'java开发工程师',
#            'name': '钱七',
#            'sex': '男'},
#   'python': [{'age': 30,
#               'height': 175,
#               'info': 'python工程师',
#               'name': '张三',
#               'sex': '男'},
#              {'age': 28,
#               'height': 185,
#               'info': 'python工程师',
#               'name': '李四',
#               'sex': '男'},
#              {'age': 18,
#               'height': 170,
#               'info': 'python工程师',
#               'name': '小花',
#               'sex': '女'},
#              {'age': 28,
#               'height': 185,
#               'info': 'python开发工程师',
#               'name': '王五',
#               'sex': '男'},
#              {'age': 28,
#               'height': 190,
#               'info': 'python开发工程师',
#               'name': '赵六',
#               'sex': '男'}]}]

3、[ ]也表示子元素

from jsonpath import jsonpath

# 使用[]输出根元素下边的technology下边的python的所有内容
res = jsonpath(user_info, "$[technology][python]")
pprint.pprint(res)
# 输出为列表
# [[{'age': 30, 'height': 175, 'info': 'python工程师', 'name': '张三', 'sex': '男'},
#   {'age': 28, 'height': 185, 'info': 'python工程师', 'name': '李四', 'sex': '男'},
#   {'age': 18, 'height': 170, 'info': 'python工程师', 'name': '小花', 'sex': '女'},
#   {'age': 28, 'height': 185, 'info': 'python开发工程师', 'name': '王五', 'sex': '男'},
#   {'age': 28, 'height': 190, 'info': 'python开发工程师', 'name': '赵六', 'sex': '男'}]]

4、..递归搜索(不管当前路径,搜素符合条件的数据)这个也是重点

from jsonpath import jsonpath


# 递归找python相关的 【重点】
res = jsonpath(user_info, "$..python")
pprint.pprint(res)
# 输出为列表
# [[{'age': 30, 'height': 175, 'info': 'python工程师', 'name': '张三', 'sex': '男'},
#   {'age': 28, 'height': 185, 'info': 'python工程师', 'name': '李四', 'sex': '男'},
#   {'age': 18, 'height': 170, 'info': 'python工程师', 'name': '小花', 'sex': '女'},
#   {'age': 28, 'height': 185, 'info': 'python开发工程师', 'name': '王五', 'sex': '男'},
#   {'age': 28, 'height': 190, 'info': 'python开发工程师', 'name': '赵六', 'sex': '男'}]]


# 递归找递归找员工姓名 【重点】
res = jsonpath(user_info, "$..name")
pprint.pprint(res)
# 输出为列表
# ['张三', '李四', '小花', '王五', '赵六', '钱七']

5、[ ]子元素操作符

from jsonpath import jsonpath


# 读取python部门员工的name与age,获取指定字段的值
# [0,1]取索引为0到1的,两边都是闭区间
res = jsonpath(user_info, "$..python.[0,1]")
pprint.pprint(res)
# 输出为列表
# [{'age': 30, 'height': 175, 'info': 'python工程师', 'name': '张三', 'sex': '男'},
 # {'age': 28, 'height': 185, 'info': 'python工程师', 'name': '李四', 'sex': '男'}]

6、[start:end:step]数组分割符,等同于切片

from jsonpath import jsonpath

# 读取python部门中的子元素
# 使用[start:end:step]切片,左闭右开
# [0:4:2]从0-3,间隔为2
res = jsonpath(user_info, "$..python.[0:4:2]")
pprint.pprint(res)
# 输出为列表
# [{'age': 30, 'height': 175, 'info': 'python工程师', 'name': '张三', 'sex': '男'},
#  {'age': 18, 'height': 170, 'info': 'python工程师', 'name': '小花', 'sex': '女'}]

7、[ , ]支持迭代器中做多选,选择想要输出的key

from jsonpath import jsonpath

# 读取python部门老师的name与age,获取指定字段的值
res = jsonpath(user_info, "$..python.[name,age]")
pprint.pprint(res)
# 输出为列表
# ['张三', 30, '李四', 28, '小花', 18, '王五', 28, '赵六', 28]

8、?()过滤表达式,用来过滤想要的条件的内容

9、@表示当前元素

from jsonpath import jsonpath

# 读取python部门中符合年龄的员工
# 表达式解读,在根目录下递归去找python部门的子元素,然后在子元素的当前元素中去筛选age<25的员工
res = jsonpath(user_info, "$..python.[?(@.age<25)]")
pprint.pprint(res)
# 输出为列表
# [{'age': 18, 'height': 170, 'info': 'python工程师', 'name': '小花', 'sex': '女'}]


# 读取python部门员工中符合多个条件的
# 读取python部门中符合年龄和性别的员工
res = jsonpath(user_info, "$..python.[?(@.age<29 and @.sex == '男')]")
pprint.pprint(res)
# 输出为列表
# [{'age': 28, 'height': 185, 'info': 'python工程师', 'name': '李四', 'sex': '男'},
#  {'age': 28, 'height': 185, 'info': 'python开发工程师', 'name': '王五', 'sex': '男'},
#  {'age': 28, 'height': 190, 'info': 'python开发工程师', 'name': '赵六', 'sex': '男'}]


# # 读取python部门中年龄小于29或者性别为"女"的员工
res = jsonpath(user_info, "$..python.[?(@.age<29 or @.sex == '女')]")
pprint.pprint(res)
# 输出为列表
# [{'age': 28, 'height': 185, 'info': 'python工程师', 'name': '李四', 'sex': '男'},
#  {'age': 18, 'height': 170, 'info': 'python工程师', 'name': '小花', 'sex': '女'},
#  {'age': 28, 'height': 185, 'info': 'python开发工程师', 'name': '王五', 'sex': '男'},
#  {'age': 28, 'height': 190, 'info': 'python开发工程师', 'name': '赵六', 'sex': '男'}]

10、成员运算


from jsonpath import jsonpath

# 找到张三和小花的信息
res = jsonpath(user_info, "$..python.[?(@.name in ['张三','小花'])]")
pprint.pprint(res)
# 输出为列表
# [{'age': 30, 'height': 175, 'info': 'python工程师', 'name': '张三', 'sex': '男'},
#  {'age': 18, 'height': 170, 'info': 'python工程师', 'name': '小花', 'sex': '女'}]

# 打印张三和小花的年龄
res = jsonpath(user_info, "$..python.[?(@.name in ['张三','小花'])].age")
pprint.pprint(res)
# 输出为列表
# [30, 18]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值