JSON Schema是一个用来定义和校验JSON规范的工具,用来检测返回的JSON是否符合预期

安装

pip install jsonschema==4.23.0

使用

首先来对比以下JSON和JSON Schema之间的不同,以下是同一段数据的两种不同格式的表现

JSON:

{
    "code":200,
    "msg":"",
    "data":True
}

JSON Schema:

{
    "type":"object",
    "required":[],
    "properties":{
        "code":{
            "type":"number"
        },
        "msg":{
            "type":"string"
        },
        "data":{
            "type":"boolean"
        }
    }
}

以上就是两种形式的对比,其中JSON Schema通过 "type" "required" "properties"来确保JSON的正确性和一致性,不过需要注意的是,使用JSON Schema只能判定返回结果是否是我们想要的数据类型或者是某一种格式,无法直接判定返回数据的具体结果是不是我们想要的

在转换为JSON Schema时,我们也可以使用快捷工具: https://tooltt.com/json2schema/

但是在使用之后,我们也需要进行核查,工具得出的数据类型并不一定就是正确的!!

让我们使用代码来运行上述例子看一下结果吧:

from jsonschema import validate # 导入对应的模块
class Test:
    def test(self):
        json = {
            "code":200,
            "msg":"",
            "data":True
        }

        json_schema = {
            "type":"object",
            "required":[],
            "properties":{
                "code":{
                    "type":"number"
                },
                "msg":{
                    "type":"string"
                },
                "data":{
                    "type":"boolean"
                }
            }
        }
        validate(json,json_schema) # 进行对比使用的函数

数据类型

使用 type 关键字指定校验的数据类型,可以验证JSON数据中的每个属性的数据类型是否符合预期,总共有以下几种数据类型:

数据类型(type)

使用场景

object

对象类型,用于判定嵌套的JSON对象

array

数组类型,用于判定列表或者集合

null

空值类型(注意""是字符串类型,不是空值)

string

字符串类型,用于判断文本数据

number

数字类型,用来判断整数或者浮点数

integer

整数类型,用于判断整型数字

boolean

布尔类型,用来判断true或者false

同时在进行校验的时候,除了 type 关键字,还会同时使用 properties 验证关键字,使用这个关键字定义时,创建了一个对象,其中每一个属性就是需要进行验证的JSON数据中的一个建

最大最小值

判断最大最小有两组不同的关键字,使用的场景不同:

  •  minimum maximum :指定数值必须大于等于或者小于等于设定值

  •  exclusiveMinimum exclusiveMaximum :指定数值必须大于或者小于设定值(不包含等于)

示例1

使用 minimum 和 maximum

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "code": 2
        }
        json_schema = {
            "type":"object",
            "properties":{
                "code":{
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 50
                }
            }
        }
        validate(json,json_schema)

如果判定失败,即不满足小于等于或者大于等于

示例2

使用 exclusiveMinimum 和 exclusiveMaximum

def test(self):
    json = {
        "code": 2
    }
    json_schema = {
        "type":"object",
        "properties":{
            "code":{
                "type": "integer",
                "exclusiveMinimum": 2,
                "exclusiveMaximum": 50
            }
        }
    }
    validate(json,json_schema)

字符串校验

使用JSON Schema进行字符串校验时,我们需要使用 pattern 关键字来进行校验,同时需要配合正则表达式一起使用来验证字符串是否符合特定的模式

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "name":"abd"
        }
        json_schema={
            "type":"object",
            "properties":{
                "name":{
                    "type": "string",
                    "pattern":"a[bc]d" # 匹配abd 和 acd
                }
            }
        }
        validate(json,json_schema)

数组约束

JSON Schema有三种关键字用来进行数组约束:

  •  minItems maxItems :指定数组的最小和最大的长度

  •  uniqueItems :确保数组中的元素是唯一的

  •  items :定义数组中每个元素的类型和约束

示例1

minItems 和 maxItems

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "array":[1,2,3,4,5]
        }
        json_schema = {
            "type":"object",
            "properties":{
                "array":{
                    "type":"array",
                    "minItems":4,
                    "maxItems":6
                }
            }
        }
        validate(json,json_schema)

判定为失败的情况:

示例2

uniqueItems 关键字,默认情况下数组中的元素是可以重复的,使用这个关键字可以判定唯一元素

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "array":[1,2,3,5,5]
        }
        json_schema = {
            "type":"object",
            "properties":{
                "array":{
                    "type":"array",
                    "minItems":2,
                    "maxItems":9,
                    "uniqueItems":True
                }
            }
        }
        validate(json,json_schema)

示例3

items关键字,默认情况是不会对数组中的值进行类型判定的

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "array":[1,2,3,4,5]
        }
        json_schema = {
            "type":"object",
            "properties":{
                "array":{
                    "type":"array",
                    "minItems":2,
                    "maxItems":9,
                    "uniqueItems":True,
                    "items":{"type":"number"}
                }
            }
        }
        validate(json,json_schema)

如果数组中不仅仅只有一种类型,那我们就需要在items中的type进行设置

对象约束

对象约束的关键字并不是在 properties 中,而是跟properties同一层

  •  minProperties maxProperties :指定对象的最小和最大属性数量

  •  additionalProperties :控制是否允许对象中存在没有在 properties 中定义的额外属性,默认为 True

示例1

minProperties 和 maxProperties 判定对象数量

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "code":200,
            "msg":"登陆成功!"
        }
        json_schema = {
            "type":"object",
            "properties":{
                "code":{
                    "type":"number",
                },
                "msg":{
                    "type":"string"
                }
            },
            "minProperties": 1,
            "maxProperties": 5,
        }
        validate(json,json_schema)

示例2

additionalProperties ,默认情况下是可以有properties中没有设定的数据,但是可以通过这个关键字来进行改变

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "code":200,
            "msg":"登陆成功!",
            "data":3
        }
        json_schema = {
            "type":"object",
            "properties":{
                "code":{
                    "type":"number",
                },
                "msg":{
                    "type":"string"
                }
            },
            "additionalProperties":False
        }
        validate(json,json_schema)

必需属性

可以使用 required 关键字用来判定哪一些属性是必需的,如果返回的JSON数据中缺少定义的这些属性,就会验证失败

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "code":200,
            "msg":"登陆成功!",
        }
        json_schema = {
            "type": "object",
            "properties": {
                "code": {
                    "type": "number",
                },
                "msg": {
                    "type": "string"
                }
            },
            "required":["code","msg","data"]
        }
        validate(json, json_schema)

依赖关系

可以使用 dependentRequired 关键字来定义属性之间的依赖关系

如果关系是这样的: "aaa":["bbb","ccc"] 也就是说如果aaa存在,那么bbb和ccc必须存在,但是反过来,aaa不一定存在

from jsonschema import validate
class Test:
    def test(self):
        json = {
            "code": 200,
            "msg": "登陆成功!",
        }
        json_schema = {
            "type": "object",
            "properties": {
                "code": {
                    "type": "number",
                },
                "msg": {
                    "type": "string"
                }
            },
            "dependentRequired": {
                "code":["msg","data"]
            }
        }
        validate(json, json_schema)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐