一、引言
什么是Json Schema
?
JSON Schema是基于JSON格式,用于定义JSON数据结构以及校验JSON数据内容。
假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友。一个请求的例子如下:
{
"city" : "chicago",
"number": 20,
"user" : {
"name":"Alex",
"age":20
}
}
在上面的例子中,web api要求提供city,number,user三个成员,其中city是字符串,number是数值,user是一个对象,又包含了name和age两个成员。
对于api来说,需要定义什么样的请求合法,即什么样的Json对于api来说是合法的输入。这个规范可以通过Json Schema来描述,对应的Json Schema如下
{
"type": "object",
"properties": {
"city": { "type": "string" },
"number": { "type": "number" },
"user": {
"type": "object",
"properties": {
"name" : {"type": "string"},
"age" : {"type": "number"}
}
}
}
}
例子可以使用https://www.jsonschemavalidator.net/来验证
JSON Schema中比较常见的关键字如下:
type取值
在线jsonschema 转换:https://jsonschema.net/#/
之前验证接口的代码为:
import requests
#查询发布会接口
url = "http://127.0.0.1:8000/api/get_event_list/"
r = requests.get(url, params={'eid':'1'})
result = r.json()
print(result)
assert result['status'] == 200
assert result['message'] == "success"
assert result['data']['name'] == "锤子手机发布会"
assert result['data']['address'] == "成都"
assert result['data']['start_time'] == "2017-11-21T15:25:19"
使用schame校验
- 导入包
- 申明一个Schame
- 调用Valid函数,如果得到的值不出错,则运行时不会抛出异常。
代码如下:
如下带有token的校验,由于token的值不固定,它是一个30位长度的16进制,0-9和a-f生成的字符串,可以用正则匹配
from jsonschema import validate
# 需要校验的内容
result = {
"code": 0,
"msg": "login success!",
"token": "000038efc7edc7438d781b0775eeaa009cb64865",
"username": "test"
}
# 编写schema 内容
#下面是给json定义一个规范,也就是json中每个key的value值的数据类型,长度或使用正则校验起始或结尾的字符等
schema = {
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "test demo",
"description": "validate result information",
"type": "object",
"properties": {
"code": {
"description": "error code",
"type": "integer"
},
"msg": {
"description": "error msg ",
"type": "string"
},
"token":
{
"description": "login success return token",
"maxLength": 30,#长度
"pattern": "^[a-f0-9]{40}$", # 正则校验a-f0-9的16进制,总长度40
"type": "string"#类型
}
},
"required": [
"code", "msg", "token"
]
}
1
assert(instance=result, schema=schema)#result要校验的数据,schema规范
validate(inputvalues,schema=myschema)
validate()
函数将首先验证所提供的模式本身是否有效,因为不这样做会导致不太明显的错误消息,并以不太明显或一致的方式失败。然后再验证json数据。
如果JSON数据实例是无效的,则抛出 jsonschema.exceptions.ValidationError 异常
如果schema模式本身是无效的,则抛出 jsonschema.exceptions.SchemaError 异常
关键字详细解释:
$schema
该关键字用于指定JSON Schema版本信息,该关键字是可以省略的,当前最新版本为draft-07。注意:该关键字的值必须使用官方提供的值,不能自己随便写。
title和description
这两个关键字都是用来描述对应的JSON元素的,唯一的区别在于,title相对来说,更加简洁,而description更加倾向于详细描述相关信息。当然了,这两个关键字都是可以省略的。
type
该关键字用于限定待校验JSON元素所属的数据类型,例一中最外层的type关键字值为object,即表示待校验JSON数据为一个JSON对象