Python JsonSchema 校验
参考地址
什么是 JSON Schema?
Json Schema, 也称为 Json 模式。 Json Schema 是描述你的Json 数据格式;
作用:
- 对现有的json数据格式进行描述(字段类型、内容长度、是否必须存在、取值示例等)
- 是一个描述清晰、人机可读的文档;
- 自动测试、验证客户端提交的数据;
关键字
常用关键字:#
- $schema:该关键字声明该模式是根据标准的特定草案编写的,主要用于版本控制,可省略。
- $id: 该关键字定义模式的URI,可省略。
- title 和 description:该JSON Schema的注释和描述信息,不会向验证的数据调节约束。
- type:该关键字会定义JSON数据的第一个约束,比如是JSON对象还是数组。
- 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类型有三个关键字:
- type(限定类型)
- properties(定义 object 的各个字段)
- required(限定必需字段)
校验函数#
- 以此示例函数校验一下 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"} # 错误
其他参数#
- maxLength 定义字符串的最大长度,>=0
- minLength 定义字符串的最小长度,>=0
- 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" } # 错误
- minimum最小值
- exclusiveMinimum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上大于 "minimum" 的值则实例有效。
- maximum约束属性,最大值exclusiveMaximum如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上小于 "maximum" 的值则实例有效。
- 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": "食品类" } # 错误
- minimum 最小值.exclusiveMinimum 如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上大于 "minimum" 的值则实例有效。
- maximum 约束属性,最大值
- 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
}
- itemsarray 每个元素的类型.
- minItems 约束属性,数组最小的元素个数
- maxItems 约束属性,数组最大的元素个数
- uniqueItems 约束属性,每个元素都不相同
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步