python接口自动化34-json校验神器jsonschema
前言
前面一篇讲到json解析神器jsonpath, jsonpath是为了方便快速取值,如果我们要校验json的字段类型和格式,就不是那边方便了。
比如当接口返回一个token,这个token值不是固定的,就算取到了也不好断言,这时候我们希望断言的是token的类型是字符串,长度是固定多少位。
jsonschema
先安装 jsonschema 依赖包
pip install jsonschema
jsonschema 是基于JSON格式,用于定义 JSON 数据结构以及校验 JSON 数据内容。支持python2.7+和python3+
jsonschema 参考文档地址:https://python-jsonschema.readthedocs.io/en/latest/
>>> from jsonschema import validate >>> # A sample schema, like what we'd get from json.load() >>> schema = { ... "type" : "object", ... "properties" : { ... "price" : {"type" : "number"}, ... "name" : {"type" : "string"}, ... }, ... } >>> # If no exception is raised by validate(), the instance is valid. >>> validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema) >>> validate( ... instance={"name" : "Eggs", "price" : "Invalid"}, schema=schema, ... ) Traceback (most recent call last): ... ValidationError: 'Invalid' is not of type 'number'
也可以支持命令行执行
$ jsonschema -i sample.json sample.schema
完全支持 Draft 7
, Draft 6
, Draft 4
和 Draft 3
使用示例
如下带有token的校验,由于token的值不固定,它是一个40位长度的16进制,0-9和a-f生成的字符串,可以用正则匹配
from jsonschema import validate # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ # 需要校验的内容 result = { "code": 0, "msg": "login success!", "token": "000038efc7edc7438d781b0775eeaa009cb64865", "username": "test" } # 编写schema 内容 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": 40, "pattern": "^[a-f0-9]{40}$", # 正则校验a-f0-9的16进制,总长度40 "type": "string" } }, "required": [ "code", "msg", "token" ] } # validate校验, 跟assert断言一个意思 validate(instance=result, schema=schema)
validate 校验成功时候,不会有报错
- JSON 数据校验失败,抛出 jsonschema.exceptions.ValidationError 异常
- schema 模式本身有问题,抛出 jsonschema.exceptions.SchemaError 异常
schema语法
参数 | 描述 |
---|---|
$schema | 表示该JSON Schema文件遵循的规范 |
title | 为该JSON Schema文件提供一个标题 |
description | 关于该JSON Schema文件的描述信息 |
type | 表示待校验元素的类型(例如,最外层的type表示待校验的是一个JSON对象,内层type分别表示待校验的元素类型为,整数,字符串,数字) |
properties | 定义待校验的JSON对象中,各个key-value对中value的限制条件 |
required | 定义待校验的JSON对象中,必须存在的key |
minimum | 用于约束取值范围,表示取值范围应该大于或等于minimum |
exclusiveMinimum | 如果minimum和exclusiveMinimum同时存在,且exclusiveMinimum的值为true,则表示取值范围只能大于minimum |
maximum | 用于约束取值范围,表示取值范围应该小于或等于maximum |
exclusiveMaximum | 如果maximum和exclusiveMaximum同时存在,且exclusiveMaximum的值为true,则表示取值范围只能小于maximum |
multipleOf | 用于约束取值,表示取值必须能够被multipleOf所指定的值整除 |
maxLength | 字符串类型数据的最大长度 |
minLength | 字符串类型数据的最小长度 |
pattern | 使用正则表达式约束字符串类型数据 |
type取值
type取值 | python数据类型 |
---|---|
object | dict |
array | list |
integer | int |
number | float或int |
null | None |
boolean | bool |
string | str |