什麼是JSON Schema?

如果你曾經使用過XML Schema,RelaxNG或ASN.1,那麼你很可能已經知道什麼是JSON Schema,並且可以跳過本文的閱讀。如果你是頭一次聽說,或者聽過過這個詞彙但不瞭解,那麼你來對地方了。

要了解JSON Schema是什麼,我們應該首先了解JSON是什麼。

JSON代表“JavaScript Object Notation”,一種簡單的互聯網數據交換格式。由於JavaScript存在於絕大多數Web瀏覽器中,而JSON基於JavaScript而來,因此很容易在JavaScript中的得到支持。同時,它已被證明足夠有用且足夠簡單,現在也被用於許多其他不涉及互聯網數據交換的環境中。

從本質上講,JSON建立在以下數據結構上:

對象:
{ "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數據結構,以及其中各個字段的類型信息在這裏得到了很清晰的說明。

{
  "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測試的過程,提高了測試的效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章