JSON Schema

发布于:2025-08-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

本篇主要介绍JSON Schema的基本语法,必要时会使用python代码来验证。

JSON Schema是一种用于描述JSON数据的规范,可以用来定义JSON数据对象的结构、格式和约束条件。通过JSON Schema,可以对JSON数据进行验证、校验和文档化,确保数据的正确性和完整性。

一、安装

pip install jsonschema

二、基本使用

from jsonschema.validators import validate

json={
    "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)

jsonJSONSchema太⿇烦?使⽤现有⼯具⾃动转换: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关键字可取值有:objectstringarrayintegernumberbooleannullbooleannull并没有相关的限定关键词,这里就不介绍了。

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 validate

def 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, 数组中是否允许任何未在itemsprefixItemscontains指定的数据项存在;
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)