JSON Schema⼀个用来定义和校验JSON的web规范,简而言之,JSON Schema是用来校验json是否符合预期。
根据 json 创建 JSON Schema 后,你可以使用你选择的语言中的验证器将示例数据与你的模式进行
验证。

1. 安装

pip install jsonschema==4.23.0

2. 介绍

from jsonschema.validators import validate

def test_01():
    json = {
        "code": 1,
        "emg": "123123",
        "data": {
            "id": 1,
            "name": "zhangsan",
            "isAdmin": False
        }
    }
    json_schema = {
        "type": "object",
        "required": [],
        "properties": {
            "code": {
                "type": "number"
            },
            "msg": {
                "type": "string"
            },
            "data": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "number"
                    },
                    "name": {
                        "type": "string"
                    },
                    "isAdmin": {
                        "type": "boolean"
                    }
                }
            }
        }
    }
    validate(instance=json, schema=json_schema) # 验证json是否符合schema

json转json schema自动工具, https://tooltt.com/json2schema/, 可能会有错误, 要自己检查

3. 数据类型

在这里插入图片描述

integer / number

type类型为integer / number 时, 可以对数值的范围进行限定, 关键字:

  • minimummaximum :指定数值的最小值和最大值。
  • exclusiveMinimumexclusiveMaximum :指定数值必须严格大于或小于某个值(不包
    含等于)。
from jsonschema.validators import validate

def test_01():
    json = {
        "code": 1,
        "emg": "123123",
        "data": {
            "id": 1,
            "name": "zhangsan",
            "isAdmin": False
        }
    }
    json_schema = {
        "type": "object",
        "required": [],
        "properties": {
            "code": {
                "type": "number"
            },
            "msg": {
                "type": "string"
            },
            "data": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "number",
                        "minimum": 2, # 最小值设置为2, 传参为1, 报错
                        "maximum": 100
                    },
                    "name": {
                        "type": "string"
                    },
                    "isAdmin": {
                        "type": "boolean"
                    }
                }
            }
        }
    }
    validate(instance=json, schema=json_schema)

在这里插入图片描述

string

type类型为string时, 可以对字符串的模式进行限定, 关键字:

  • pattern :使用正则表达式来验证字符串是否符合特定的模式。

正则表达式介绍https://www.runoob.com/regexp/regexp-syntax.html

from jsonschema.validators import validate

def test_01():
    json = {
        "code": 1,
        "emg": "123123",
        "data": {
            "id": 1,
            "name": "zhangsan",
            "isAdmin": False
        }
    }
    json_schema = {
        "type": "object",
        "required": [],
        "properties": {
            "code": {
                "type": "number"
            },
            "msg": {
                "type": "string"
            },
            "data": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "number",
                    },
                    "name": {
                        "type": "string",
                        "pattern": r"\S+" # r表示这是一个原始字符, 不要处理成转义字符
                    },
                    "isAdmin": {
                        "type": "boolean"
                    }
                }
            }
        }
    }
    validate(instance=json, schema=json_schema)

在这里插入图片描述

array

type类型为array时, 可以对数组中的数据进行约束, 关键字:

  • minItemsmaxItems :指定数组的最小和最大长度。
  • uniqueItems :True表示数组中的元素是唯一的, False表示数组中的元素不用是唯一的
  • items :定义数组中每个元素的类型和约束。
from jsonschema.validators import validate

def test_01():
    json = {
        "code": 1,
        "emg": "123123",
        "data": {
            "id": 1,
            "name": "zhangsan",
            "isAdmin": False
        },
        "aaa": [1, 2, 2]
    }
    json_schema = {
        "type": "object",
        "required": [],
        "properties": {
            "code": {
                "type": "number"
            },
            "msg": {
                "type": "string"
            },
            "data": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "number",
                    },
                    "name": {
                        "type": "string",
                    },
                    "isAdmin": {
                        "type": "boolean"
                    }
                }
            },
            "aaa":{
                "type": "array",
                "items": { # 数组中的数据的类型
                    "type": "integer"
                },
                "minItems": 1,# 数组最小的长度
                "uniqueItems": True # 数组中的数据要求唯一, 此时数组数据不唯一, 报错
            }
        }
    }
    validate(instance=json, schema=json_schema)

在这里插入图片描述

object

type类型为object时, 可以对对象进行约束, 关键字:

  • properties: 约束对象中的属性
  • minPropertiesmaxProperties :指定对象的最小和最大属性数量。
  • additionalProperties :控制是否允许对象中存在未在 properties 中定义的额外属性,默
    认为True, 表示允许。
  • required: JSON Schema 可以指定哪些属性是必需的。如果 JSON 实例中缺少这些必需属性,验证将失败
  • dependentRequired : 可以定义属性之间的依赖关系。例如,如果某个属性存在(前),则必须存在另一个属性(后)。
from jsonschema.validators import validate

def test_01():
    json = {
        "code": 1,
        "emg": "123123",
        "data": {
            "id": 1,
            "name": "zhangsan",
            "isAdmin": False
        },
        "aaa": [1, 2, 2]
    }
    json_schema = {
        "type": "object",
        "minProperties": 1, # 属性个数最少为1
        "additionalProperties": False, # 不允许出现properties定义中的额外属性, 此时出现了"aaa", 报错
        "required": ["code", "emg"],# 必须包含"code", "emg"
        "dependentRequired": {
            "data": ["code"] # data出现, 必须code也要出现
        },
        "properties": {
            "code": {
                "type": "number"
            },
            "msg": {
                "type": "string"
            },
            "data": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "number",
                    },
                    "name": {
                        "type": "string",
                    },
                    "isAdmin": {
                        "type": "boolean"
                    }
                }
            }
        }
    }
    validate(instance=json, schema=json_schema)

在这里插入图片描述

更多推荐