Python-介面自動化json資料校驗模組jsonschema
阿新 • • 發佈:2020-08-16
前面一篇講到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 # 需要校驗的內容 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": 40, "pattern": "^[a-f0-9]{40}$", # 正則校驗a-f0-9的16進位制,總長度40 "type": "string" } }, "required": [ "code", "msg", "token" ] } # 校驗, 跟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 |