使用jsonschema校验json数据
https://www.jianshu.com/p/e750ff6962b7
http://www.jianshu.com/p/ec40734c872a
jsonschema用来标记和校验json数据,可在自动化测试中验证json的整体结构和字段类型
在线jsonschema 转换:https://jsonschema.net/#/
首先,了解一下json的数据类型和schema语法
最外层字段
| 参数 | 描述 |
|---|---|
| $schema | json schema文件遵守的规范 |
| title | json schema文件的标题 |
| description | json schema文件的描述信息 |
object
| 参数 | 描述 |
|---|---|
| properties | 定义待校验的json对象中,各key-value对中value的限制条件 |
| required | 待校验的json对象中,必须存在的key |
string
| 参数 | 描述 |
|---|---|
| maxLength | 字符串类型数据的最大长度 |
| minLength | 字符串类型数据的最小长度 |
| pattern | 使用正则表达式约束字符串类型数据 |
| enum | 枚举约束 |
number
| 参数 | 描述 |
|---|---|
| minimum | 用于约束取值范围,取值范围大于等于minimum |
| maximum | 用于约束取值范围,取值范围小于等于minimum |
| exclusiveMinimum | 如果minimum和exclusiveMinimum同时存在,且exclusiveMinimum的值为true,则表示取值范围只能大于minimum |
| exclusiveMaximum | 如果maximum和exclusiveMaximum同时存在,且exclusiveMaximum的值为true,则表示取值范围只能小于maximum |
| multipleOf | 用于约束取值,表示取值必须能够被multipleOf所指定的值整除 |
array
| 参数 | 描述 |
|---|---|
| items | 子元素 |
| required | 必须子元素 |
| minitems | 最少子元素个数 |
| maxitems | 最大子元素个数 |
| uniqueItems | 每个元素都不相同,唯一 |
通用
| 参数 | 描述 |
|---|---|
| type | 待校验元素的类型,可为:object,string,null,integer,number,array,boolean |
内部引用
- definitions用来定义公共约束
- $ref用来引用definitions中定义的约束
其中,聚合关键字allOf,anyOf,oneOf,not
- allOf 必须满足所有的约束才算通过
- anyOf 必须满足任意一个或多个约束才算通过
- oneOf 必须满足任意一个约束才算通过
-not 不满足约束条件
基本使用
需校验的json数据:
{
"code":200,
"message":"测试通过",
"data":{
"data1":"test",
"data2":["test1","test2"]
}
}
整个json结构可描述为,整体为object类型,包含code,message,data四个属性,其中data为object类型,其中data1为array数组类型,code和message为字符串类型,使用jsonschema描述,如下:
{
"definitions":{
"data":{
"anyof":[
{"type":"string"},
{"pattern":"^test$"}]}
},
"type":"object",
"properties":{
"code":{
"type":"integer"
},
"message":{
"type":"string",
"pattern":"^测试通过$"
},
"data":{
"type":"object",
"required":[
"data1",
"data2"
],
"properties":{
"data1":{"$ref":"#/definitions/data"},
"data2":{
"type":"array",
"items":{"type":"string"},
"minItems":1,
"maxItems":2,
"uniqueItems":True
}
}
}
}
}
- validate校验成功时,不会有报错
- json数据校验失败时,抛出jsonschema.exceptions.ValidationError异常
- schema模式本身有问题时,抛出jsonschema.exceptions.SchemaError异常
安装:
pip install jsonschema
pip install jsonschema
校验的参数为字符串、数字、列表、必填项
from jsonschema import validate schema = { "type": "object", "properties": { "price": {"type": "number"}, "name": {"type": "string"}, "action": {"enum": ["resume", "down"]}, "noname": {"type": "string", 'minLength': 1, 'maxLength': 100}, }, "pro": { 'tag': { 'type': 'array', 'items': { "type": "string" } } }, 'required': ['noname'], #必填项 } validate(instance={"name": "Eggs", "price": 34.99}, schema=schema) # pass,校验数字 # validate(instance={"name": "Eggs", "price": 'd'}, schema=schema) # faild,校验数字 validate(instance = { "tag" :[1,2,3]},schema = schema ) # pass,校验列表 validate(instance={"action": 'resume'}, schema=schema) # pass,校验枚举类型 # validate(instance={"action": 'd'}, schema=schema) # faild,校验 validate(instance={"action": 'resume','noname': 'zhangbiao'}, schema=schema) # pass,校验枚举类型+字段长度 # validate(instance={"action": 'resume'}, schema=schema) # faild,必填项校验
结果是:
Failed validating 'type' in schema['properties']['price']:
{'type': 'number'}
On instance['price']:
'd'
校验的参数为json串
schema = {"type": "object",
"properties": {
"resumejobid": {"type": "integer", "minimum": 0},
"parameters": {
"type": "object",
"properties": {
"name": {"type": "string"},
"queue": {"type": "string"},
"workspace": {"type": "string"},
},
"required": ["name", "queue", "workspace"]
},
},
"required": ["parameters", "resumejobid"]
}
validate(instance={"parameters": {"name": "", "queue": "", "workspace": ""},
'resumejobid': 12}, schema=schema) # pass
inputvalues = {'message': 'success', 'data': {'address': '成都', 'eid': 1, 'name': '锤子手机发布会', 'limit': 2000, 'start_time': '2017-11-21T15:25:19', 'status': True}, 'status': 200}
validate(inputvalues,schema=schema)
实际断言时可以将jsonschema存在文件,然后取出来校验。
r = requests.get(url)
schema=json.load(open("list_schema.json"))
validate(instance=r.json(), schema=schema)
Json schema 高级用法
|
1
2
|
https://www.cnblogs.com/terencezhou/p/10474617.htmlhttps://json-schema.org/understanding-json-schema/reference/combining.html?highlight=oneof |
如何快速写出Json Schema,校验Json Schema

浙公网安备 33010602011771号