jsonschema — Python全量字段校验

鹿先森JIAN / 2023-09-01 / 原文

概念:校验接⼝返回响应结果的全部字段(更进一步的断言)

校验内容:

字段值

字段名 或 字段类型

校验流程:

定义json语法校验格式

⽐对接口实际响应数据是否符合json校验格式

安装 jsonschema

pip install jsonschema -i https://pypi.douban.com/simple/

查验:

在终端查验:pip listpip show jsonschema

校验方式

1、在线工具校验

http://json-schema-validator.herokuapp.com

https://www.jsonschemavalidator.net【推荐】

2、python代码校验

实现步骤:

  • 1 导包 import jsonschema

  • 2 定义 jsonschema格式 数据校验规则

  • 3 调⽤ jsonschema.validate(instance="json数据", schema="jsonshema规则")

查验校验结果:

  • 校验通过:返回 None

  • 校验失败

    • schema 规则错误,返回 SchemaError

    • json 数据错误,返回 ValidationError

JSON Schema 语法

type 关键字

作用:约束数据类型

properties 关键字

说明:是 type关键字的辅助。用于 type 的值为 object 的场景。

作用:指定 对象中 每个字段的校验规则。 可以嵌套使用。 

required 关键字

作用:校验对象中必须存在的字段。字段名必须是字符串,且唯⼀

const 关键字

作用:校验字段值是⼀个固定值。 

import jsonschema
# 测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "data": None,
}
# 校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"const": True},
        "code": {"const": 10000},
        "message": {"const": "操作成功"},
        "data": {"const": None}
    },
    "required": ["success", "code", "message", "data"]
}
# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

# None: 代表校验通过
# ValidationError:数据 与 校验规则不符
# SchemaError: 校验规则 语法有误

pattern 关键字

作用:指定正则表达式,对字符串进行模糊匹配

import jsonschema
# 测试数据
data = {
    "message": "!jeklff37294操作成功43289hke",
    "mobile": "15900000002"
}
# 校验规则
schema = {
    "type": "object",
    "properties": {
        "message": {"pattern": "操作成功"},
        "mobile": {"pattern": "^[0-9]{11}$"}
    }
}
# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

综合案例应用

import jsonschema
# 测试数据
data = {
    "success": False,
    "code": 10000,
    "message": "xxx登录成功",
    "data": {
        "age": 20,
        "name": "lily"
    }
}
# 校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"type": "boolean"},
        "code": {"type": "integer"},
        "message": {"pattern": "登录成功$"},
        "data": {
            "type": "object",
            "properties": {
                "name": {"const": "lily"},
                "age": {"const": 20}
            },
            "required": ["name", "age"]
        }
    },
    "required": ["success", "code", "message", "data"]
}
# 调用测试方法
res = jsonschema.validate(instance=data, schema=schema)
print(res)