參考

什麼是 schema?

如果您曾經使用過 XML Schema、RelaxNG 或 ASN.1,您可能已經知道什麼是 schema,並且可以愉快地跳到下一節。如果這些對您來說都像是在胡言亂語,那麼您來對地方了。要定義什麼是 JSON Schema,我們應該首先定義什麼是 JSON。

JSON 代表「JavaScript 物件表示法」,是一種簡單的資料交換格式。它最初是為全球資訊網而設計的表示法。由於 JavaScript 存在於大多數網頁瀏覽器中,而 JSON 是基於 JavaScript 的,因此很容易在那裡支援它。然而,它已被證明足夠有用且足夠簡單,現在被用於許多其他不涉及網頁瀏覽的環境中。

JSON 的核心是建立在以下資料結構之上

物件

資料
{ "key1": "value1", "key2": "value2" }

陣列

資料
[ "first", "second", "third" ]

數字

資料
423.1415926

字串

資料
"這是一個字串"

布林值

資料
true false

null

資料
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" }}

這兩種表示方式都同樣有效,儘管其中一種顯然比另一種更正式。記錄的設計很大程度上取決於其在應用程式中的預期用途,因此這裡沒有正確或錯誤的答案。然而,當應用程式說「給我一個關於人的 JSON 記錄」時,重要的是要知道該記錄的組織方式。例如,我們需要知道預期有哪些欄位,以及值的表示方式。這就是 JSON Schema 的用武之地。以下 JSON Schema 片段描述了上面第二個範例的結構。現在不用太擔心細節。它們會在後續章節中解釋。

schema
{ "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" } } } }}

透過針對此綱要「驗證」第一個範例,您可以看到它失敗了

資料
{ "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" }}
符合綱要

您可能已經注意到 JSON Schema 本身是用 JSON 編寫的。它本身是資料,而不是電腦程式。它只是一種「描述其他資料結構」的宣告式格式。這既是它的優點也是它的缺點(它與其他類似的綱要語言相同)。它可以輕鬆簡潔地描述資料的表面結構,並自動化根據它驗證資料。但是,由於 JSON Schema 不能包含任意程式碼,因此資料元素之間的關係存在某些無法表達的約束。因此,對於足夠複雜的資料格式,任何「驗證工具」都可能會有兩個驗證階段:一個在綱要(或結構)層級,另一個在語意層級。後者檢查可能需要使用更通用的程式語言來實作。

需要協助嗎?

您覺得這些文件有幫助嗎?

幫助我們讓文件更完善!

在 JSON Schema,我們重視文件貢獻,如同其他類型的貢獻一樣!

仍然需要協助嗎?

學習 JSON Schema 常常讓人感到困惑,但別擔心,我們在這裡提供協助!