JSON Schema
本篇主要介绍JSON Schema的基本语法,必要时会使用python代码来验证。
JSON Schema是一种用于描述JSON数据的规范,可以用来定义JSON数据对象的结构、格式和约束条件。通过JSON Schema,可以对JSON数据进行验证、校验和文档化,确保数据的正确性和完整性。
一、安装
pip install jsonschema
二、基本使用
from jsonschema.validators import validatejson={"name": "zhangsan","age": 18,"data": False,"hobby": "story"
}json_schema={"type": "object","required": [],"properties": {"name": {"type": "string"},"age": {"type": "number"},"data": {"type": "boolean"},"hobby": {"type": "string"}}
}
def test_a():validate(json,json_schema)
json转JSONSchema太⿇烦?使⽤现有⼯具⾃动转换:https://tooltt.com/json2schema/
注意:⼯具不是万能的,结果可能存在错误,要对⾃动⽣成的结果进⾏⼆次检查
通过URL访问,返回响应体,并检查响应体的字段类型是否正确
def test_json():schema = {"type": "object","required": [],"properties": {"code": {"type": "string"},"errMsg": {"type": "string"},"data": {"type": "array","items": {"type": "object","required": [],"properties": {"id": {"type": "number"},"title": {"type": "string"},"content": {"type": "string"},"userId": {"type": "number"},"deleteFlag": {"type": "number"},"createTime": {"type": "string"},"updateTime": {"type": "string"},"loginUser": {"type": "boolean"}}}}}}url = ("http://8.137.19.140:9090/blog/getList")header = {"user_token_header": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MiwidXNlck5hbWUiOiJsaXNpIiwiZXhwIjoxNzU0ODI3OTU5fQ.ZrZ3YsQfkFsI-6XrzbRMYzY7FzUtbE-nUPVb5m-UCB4"}r = requests.get(url=url, headers=header)validate(r.json(), schema)
三、数据类型
虽然前文中type中的关键字为object时才能校验JSON数据,但是type关键字还可以有其他取值,并且不同数据类型有各自其他限定的关键词。 type关键字可取值有:object、string、array、integer、number、boolean、null。boolean和null并没有相关的限定关键词,这里就不介绍了。
JSON Schema实际上是一个嵌套结构,下面的很多关键词的取值也可以是一个JSON Schema格式。
常⽤的数据类型包括:
type | 解释 |
string | 字符串类型,⽤于⽂本数据。 |
number | 数字类型,⽤于表⽰浮点数。 |
integer | 整数类型,⽤于表⽰整数。 |
boolean | 布尔类型,值为true或false。 |
object | 对象类型,⽤于嵌套的JSON对象。 |
array | 数组类型,⽤于列表或集合。 |
null | 空值类型。 |
3.1、object类型
object
类型类似于Python中的字典(dict)类型,其限定关键词主要有以下几个:
关键词 | 说明 |
---|---|
properties | object类型。其中每个键是待校验的JSON中属性的名称,值是用于验证该属性的模式。此关键字将忽略与properties 关键字中的任何键名称不匹配的任何属性; |
patternProperties | object类型。如果待校验的JSON中属性的名称与给定的正则表达式匹配,则属性值必须符合指定的模式; (具体用法Ai一下) |
additionalProperties | 取值为true/false 。:控制是否允许对象中存在未在properties中定义的额外属性,默认为True。 |
required | 通过 required 关键字,JSONSchema可以指定哪些属性是必需的。如果JSON实例中缺少这些必 需属性,验证将失败。 |
minProperties | 数值。待校验的JSON中的字段必须>=num |
maxProperties | 数值。待校验的JSON的字段中必须<=num |
propertyNames | 待校验的JSON中属性名称必须满足的模式;可以配合pattern 关键词使用; |
举例如下:
from jsonschema import validatedef test_a():json_schema={"type": "object","properties": {"name": {"type": "string" # 字符串},"age": {"type": "number" # 整形},"email": {"type": "string" # 字符串}},"required": ["name", "email"], # 指定name和email这两个字段必须存在"additionalProperties": False, # 表示不允许对象拥有 json_schema 中未定义的额外属性。(json中的字段都要在json_schema中)"minProperties":2, # 字段的个数最少为2个"maxProperties":5 # 字段的个数最多为5个
}json={"name":"zhangsan","age":18,"email":"asddfsc"}validate(json,json_schema)
3.2、string型
string
类型限定的关键词主要有以下:
关键词 | 说明 |
---|---|
minLength/maxLength | 数值型。字符串的最小长度、最大长度; |
pattern | 字符串需满足的正则表达式; |
format | 时间和日期:“date-time”、“time”、“date"和"duration”; 邮件:“email”,“idn-email”; 域名:“hostname” “idn-hostname”; IP: “ipv4” “ipv6”; 资源标识符:“uuid” “uri” “uri-reference” “iri” “iri-reference” ; uri-template: “uri-template”; json pointer: “json-pointer” “relative-json-pointer”; 正则表达式:“regex” |
举例如下:
def test_a():json_schema={"type": "object","properties": {"name": {"type": "string", # 字符串"maxLength": 20, # 最大字符串个数"minLength": 5 # 最小字符串个数},"data": {"type": "string", # 字符串"format": "data" # 匹配格式}}}json={"name": "zhangsan","data": "2025-8-7"}validate(json,json_schema)
正则表达式
def test_a():json={"name":"zhangsan","age":10}json_schema={"type": "object","required": [],"properties": {"name": {"type": "string","pattern":"\S{1,7}"},"age": {"type": "number"}}}validate(json,json_schema)
3.3、numeric型
JSON schema中的numeric型有两种取值:number
(类似于Python中的float型和int型)和integer
(仅类似于Python中int型)。所以这里重点介绍number
,其限定的关键词包括以下几种:
关键词 | 描述 |
---|---|
multipleOf | 正整数。数值必须为给定值的倍数; |
minimum | 数值必须大于等于该值; |
maximum | 数值必须小于等于该值; |
exclusiveMinimum | 数值必须大于该值; |
exclusiveMaximum | 数值必须小于该值; |
举例如下:
def test_a():json_schema={"type": "object","properties": {"age":{"type": "number","miximum": 20,"maximum": 300}}}json={"age": 25}validate(json,json_schema)
3.4、array型
array
型类似于类似于python中的list型和tuple型,其限定的关键词主要有以下:
关键词 | 描述 |
---|---|
items | object型。用于验证数组中的所有项; |
prefixItems | List型。按索引验证tuple中的每一个项。此时若将items 设置为false, 那么元组中将不允许有其他项; |
contains | object型。数组中至少要包含的项; |
unevaluatedItems | true/false, 数组中是否允许任何未在items 、prefixItems 和contains 指定的数据项存在; |
minItems | 最小的元组数; |
maxItems | 最大的元组数; |
uniqueItems | true/false, 数据项是否要求是唯一的; |
举例如下:
def test_a():json={"num":[1,'hello',5.4]}json_schema = {"type": "object","properties": {"num": {"type": "array","prefixItrems": [{"type": "number"},{"type": "string"}],"unevaluatedItems": True}}}validate(json,json_schema)