最近在做一些關於JSON Schema的基建,JSON Schema可以描述一個JSON結構,那么反過來他也可以來驗證一個JSON是否符合期望的格式。
如果之前看我寫的《使用joi來驗證數據模型》 可能會問,為什么不使用JOI,反而使用JSON Schema?因為JOI這個nodejs庫,除了驗證格式,還帶有驗證字段關系的功能,庫體積相對龐大,而且對於含有嵌套格式的JSON,用JOI來編寫驗證配置,極為繁瑣。JSON Schema清晰簡讀,用來驗證接口數據非常合適。
假設我們有一個期望JSON:
{
users: [
{ id: 1, username: "zzbo", }
]
}
我們理解這個JSON結構如下:
- 這個JSON對象有一個users的屬性
- 這個user屬性是一個數組
- 這個數組里面的元素是一個對象
- 每一個對象里面包含了兩個字段:id(Number),username(String)
用JSON Schema來描述這個JSON的結構
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type" : "object",
"properties" : {
"users" : {
"type" : "array",
"items" : {
"type" : "object",
"properties" : {
"id": { "type": "number" },
"username": { "type" : "string" }
}
}
}
}
}
描述一個JSON就是這么簡單。
如果還嫌編寫Shema麻煩,哪位高手來寫一個根據JSON自動生成JSON Schema的工具。
DOJO已提供了JSON Schema來驗證接口數據的功能:
dojo其實早已經這樣干,我們可以借鑒。
// 引入dojo的json schema驗證模塊
dojo.require("dojox.json.schema");
dojo.ready(function() {
// 加載指定的schema
dojo.xhrGet({
url: 'schema.json',
handleAs: 'json',
load: function(schema) {
// 拉取數據
dojo.xhrGet({
url: 'users.json',
handleAs: 'json',
load: function(users) {
// 使用 dojo 的 json schema驗證模塊來驗證
var result = dojox.json.schema.validate(users, schema);
console.log(result);
}
});
}
});
});
如果驗證合法則返回true, 否則他會返回一個錯誤信息:
{
errors: [
{
message: "is missing and not optional",
property: "users"
}
]
valid: false
}
然而,我們往往會擔心數據的某個字段缺失,或者類型不是我們所期望的,然后程序中又疏忽於這些判斷。如果我們要打造一個像dojo這樣的json schema驗證工具,除了validate功能,最好還會有一個fill功能,用於自動填充缺失的字段。
