什麼是JSON Schema?編程
若是你曾經使用過XML Schema,RelaxNG或ASN.1,那麼你極可能已經知道什麼是JSON Schema,而且能夠跳過本文的閱讀。若是你是頭一次據說,或者聽過過這個詞彙但不瞭解,那麼你來對地方了。數組
要了解JSON Schema是什麼,咱們應該首先了解JSON是什麼。瀏覽器
JSON表明「JavaScript Object Notation」,一種簡單的互聯網數據交換格式。因爲JavaScript存在於絕大多數Web瀏覽器中,而JSON基於JavaScript而來,所以很容易在JavaScript中的獲得支持。同時,它已被證實足夠有用且足夠簡單,如今也被用於許多其餘不涉及互聯網數據交換的環境中。安全
從本質上講,JSON創建在如下數據結構上:bash
對象:
{ "key1": "value1", "key2": "value2" }
數組:
[ "first", "second", "third" ]
數值:
42 3.1415926
字符串:
"This is a string"
布爾:
true false
空值:
null
複製代碼
以上這些類型在大多數編程語言中都有接近的對照類型,但它們可能有不一樣的名稱。數據結構
利用這些簡單的數據類型,能夠表示出各類結構化數據。然而,這種巨大的靈活性帶來了巨大的責任,由於一樣的概念能夠用無數種方式表現出來。例如,你能夠想象以不一樣方式表示有關JSON中某人的信息:編程語言
{
"name": "George Washington",
"birthday": "February 22, 1732",
"address": "Mount Vernon, Virginia, United States"
}
複製代碼
以及:工具
{
"first_name": "George",
"last_name": "Washington",
"birthday": "1732-02-22",
"address": {
"street_address": "3200 Mount Vernon Memorial Highway",
"city": "Mount Vernon",
"state": "Virginia",
"country": "United States"
}
}
複製代碼
以上這兩種表述一樣有效,但第二種顯然比第一種更正式。數據記錄的設計在很大程度上取決於其在應用程序中的預期用途,所以這裏沒有正確或錯誤的答案。可是,當應用程序經過API請求並指望獲得一我的的JSON記錄時,重要的是要確切知道該記錄應該如何組織。也就是說,當咱們須要知道JSON數據中預期的字段以及值的表示方式時,這就是JSON Schema的用武之地。測試
如下JSON Schema片斷描述了上面第二個例子是如何構建的。這裏咱們不對其中的細節解釋,但若是仔細觀察,你能夠看到,以上第二個例子中的JSON數據結構,以及其中各個字段的類型信息在這裏獲得了很清晰的說明。spa
{
"type": "object",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"birthday": {
"type": "string",
"format": "date"
},
"address": {
"type": "object",
"properties": {
"street_address": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
}
}
}
}
}
複製代碼
經過「驗證」針對此JSON Schema的第一個示例JSON數據,您能夠看到它失敗:
{
"name": "George Washington",
"birthday": "February 22, 1732",
"address": "Mount Vernon, Virginia, United States"
}
複製代碼
可是,第二個例子經過:
{
"first_name": "George",
"last_name": "Washington",
"birthday": "22-02-1732",
"address": {
"street_address": "3200 Mount Vernon Memorial Highway",
"city": "Mount Vernon",
"state": "Virginia",
"country": "United States"
}
}
複製代碼
您可能已經注意到,JSON Schema自己是用JSON編寫的。它是JSON數據的規範,而不是計算機程序。它只是「描述JSON數據結構」的聲明格式。這既是它的優點,也是它的弱點(和其餘Schema語言相似)。它很容易簡潔地描述數據的表面結構,並可被用於在程序運行時自動驗證數據。可是,因爲JSON Schema不能包含任意代碼,所以對沒法表達的數據元素之間的關係存在某些限制。所以,對於足夠複雜的數據格式的任何「驗證工具」可能具備兩個驗證階段:一個在結構級別,另外一個在語義級別。對於結構級別的檢查,可使用Schema語言。對於語義級別的檢查,可能須要使用更通用的編程語言來實現。
JSON Schema在API的設計與實現中具備至關重要的做用。具有JSON Schema校驗能力的API實現能夠幫助對來自用戶輸入數據的自動校驗,以及應用在各種須要在程序運行時完成校驗的場景中。這能夠幫助開發者以更加規範、嚴謹的方式來描述本身的API上承載的JSON數據,同時少寫許多手工校驗的程序代碼。
遺憾的是,目前流行的REST API設計並不能直接使用JSON Schema帶來的這種能力,這很大程度上在於,在REST API的設計理念中,API請求的參數並非一個JSON對象,而是以資源模型的方式來描述,這使得沒法使用JSON Schema來描述和自動校驗這類API上傳遞的數據。
在靈長科技CEAMS通用企業應用接口管理系統上,系統並無使用REST API的設計風格,而是參考了經典的SOAP協議設計,規定API的請求參數和返回結果必須是一個JSON對象或者數組,而且爲開發者提供了包含JSON Schema支持的API規範設計嚮導,用戶能夠很方便地在這裏設計和制定本身API上的JSON數據規範。同時,設計好的JSON Schema將在程序執行時,完成對請求和返回結果JSON數據的校驗,幫助提升了API數據的安全性,而且避免了手寫校驗代碼的繁瑣。
除了用於完成JSON數據校驗外,因爲能夠爲JSON數據提供清晰、嚴謹的聲明,JSON Schema在自動化API文檔、自動化輸入表單生成、JSON數據可視化等方面也有很好的應用場景。有很多開源項目提供了基於JSON Schema的自動化輸入表單生成能力。CEAMS系統集成了其中知名的Angular Schema Form,用於爲開發者提供的清晰、直觀的API測試工具。這樣的工具幫助開發者進一步簡化了API測試的過程,提升了測試的效率。