Python JsonSchema 校验

参考地址

JSONSchema基础知识

什么是 JSON Schema?

Json Schema, 也称为 Json 模式。 Json Schema 是描述你的Json 数据格式;

作用:

  1. 对现有的json数据格式进行描述(字段类型、内容长度、是否必须存在、取值示例等)
  2. 是一个描述清晰、人机可读的文档;
  3. 自动测试、验证客户端提交的数据;

关键字

常用关键字:#

  1. $schema:该关键字声明该模式是根据标准的特定草案编写的,主要用于版本控制,可省略。
  2. $id: 该关键字定义模式的URI,可省略。
  3. title 和 description:该JSON Schema的注释和描述信息,不会向验证的数据调节约束。
  4. type:该关键字会定义JSON数据的第一个约束,比如是JSON对象还是数组。
  5. properties:需要约束的属性,值的类型是type的值。

示例:#

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://example.com/root.json",
    "title": "The Root Schema",
    "description": "test",
    "type": "object",
    "required": [
        "foo",
        "bar",
    ],
    "properties": {
        "foo": {
            "type": "number"
        },
        "bar": {
            "const": "Must equal this value"
        }
    }
}

Json schema 类型

Object (校验 dict 形式的 Json)#

object类型有三个关键字:

  1. type(限定类型)
  2. properties(定义 object 的各个字段)
  3. required(限定必需字段)

校验函数#

  1. 以此示例函数校验一下 schema
from jsonschema import validate
# 编写校验函数
def check_metadata(json_data, schema):
    """
    正确返回True 错误返回异常的日志
    """
    try:
        validate(instance=json_data, schema=schema)
        return True
    except Exception as e:
        return e

string (字符串)#

示例#

schema = {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Test",
    "description": "Check a test schema",
    "type": "object",
    "properties": {
        "email": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$"
        },
        "host": {
            "type": "integer",
        },
    },
    "required": [  # 必填字段
        "email",
        "host"
    ]
}

# json 校验结果
json_data1 = { "email": "1245010032@qq.com", "host": 123 }  # 正确
json_data2 = { "email": "1245010032qq.com", "host": 123 }  # 错误
json_data3 = { "email": "1245010032@qq.com", "host": "123"}  # 错误

其他参数#

  1. maxLength 定义字符串的最大长度,>=0
  2. minLength 定义字符串的最小长度,>=0
  3. pattern 用正则表达式约束字符串

integer(整型)#

示例#

schema = {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Product",
    "description": "A product from Acme's catalog",
    "type": "object",
    "properties": {
        "name": {
            "description": "描述:产品名称",
            "type": "string"
        },
        "price": {
            "description": "描述:产品价格",
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "exclusiveMinimum": True
        }
    },
    "required": [
        "name",
        "price"
    ]
}
# json 校验结果
json_data = { "name": "ysl", "price": 10 }  # 正确
json_data = { "name": "ysl", "price": 0 }  # 错误
json_data = { "name": "ysl", "price": -1 }  # 错误
json_data = { "name": "ysl", "price": 10.1 }  # 错误
json_data = { "name": "ysl", "price": "10" }  # 错误
  1. minimum最小值
  2. exclusiveMinimum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上大于 "minimum" 的值则实例有效。
  3. maximum约束属性,最大值exclusiveMaximum如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上小于 "maximum" 的值则实例有效。
  4. multipleOf是某数的倍数,必须大于0的整数

number (任意数字类型)#

number 关键字可以描述任意长度,任意小数点的数字。

示例#

schema = {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "产品",
    "description": "描述:这是一个产品名称",
    "type": "object",
    "properties": {
        "name": {
            "description": "描述:产品名称",
            "type": "string"
        },
        "price": {
            "description": "描述:产品价格",
            "type": "number",
            "minimum": 0,
            "maximum": 100,
        },
    },
    "required": [
        "name",
        "price",
        "kind",  # 未在 object 中声明类型 则可以为任意类型
    ]
}

# json 校验结果
json_data = { "name": "lsy", "price": 10, "kind": "食品类" }   # 正确
json_data = { "name": "lsy", "price": 10.1, "kind": "食品类" } # 正确
json_data = { "name": "lsy", "price": 10 }                   # 错误
json_data = { "name": "lsy", "price": -10, "kind": "食品类" } # 错误
  1. minimum 最小值.exclusiveMinimum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上大于 "minimum" 的值则实例有效。
  2. maximum 约束属性,最大值
  3. exclusiveMaximum如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上小于 "maximum" 的值则实例有效。

boolean (布尔类型)#

True or False

{
    "type": "object",
    "properties": {
        "number": {
            "type": "boolean"
        },
        "street_name": {
            "type": "string"
        },
        "street_type": {
            "type": "string",
            "enum": [
                "Street",
                "Avenue",
                "Boulevard"
            ]
        }
    }
}

# json 校验结果

json_data = { "number": True }  # 正确
json_data = { "number": "True" }  # 错误
json_data = { "number": 1}        # 错误

enum (枚举类型)#

示例#

{
    "type": "object",
    "properties": {
        "number": {
            "type": "number"
        },
        "street_name": {
            "type": "string"
        },
        "street_type": {
            "type": "string",
            "enum": [
                "Street",
                "Avenue",
                "Boulevard"
            ]
        }
    }
}
# 校验数据
json_data = { "number": 10.2 } # 正确
json_data = { "number": 10.2, "street_type": "Street"} # 正确

Arrary( 校验 list 形式的 json)#

schema = {
    # list 类型
    "type": "array", 
    # 配置每个单项
    "items": {
        "type": "string",
        "enum": ["k1", "k2", "k3"]
    },
    # 要求每个 item 唯一
    "uniqueItems": True
}
  1. itemsarray 每个元素的类型.
  2. minItems 约束属性,数组最小的元素个数
  3. maxItems 约束属性,数组最大的元素个数
  4. uniqueItems 约束属性,每个元素都不相同
posted @   隔江千万里  阅读(619)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
主题色彩