什麼是 JSON
JSON 在前端日常開發中再熟悉不過,往往我們和後端的資料互動都是透過 JSON 來進行傳輸的。那麼具體什麼是 JSON 呢?
JSON(JavaScript Object Notation, JS 物件簡譜)是一種輕量級的資料交換格式。它基於 ECMAScript(European Computer Manufacturers Association, 歐洲計算機協會制定的 js 規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。
簡單來說就是:
- JSON 指的是 JavaScript 物件標記法(JavaScript Object Notation)
- JSON 是一種輕量級的資料交換格式
- JSON 具有自我描述性且易於理解
- JSON 獨立於語言*
什麼是 JSON Schema
JSON Schema,從字面我們就可以知道,它和 JSON 有緊密的關係。那麼具體是什麼呢?
JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.
JSON Schema 可以稱為 JSON 模式,是一個提議的 IETF 標準,它可以用來描述和校驗你的 JSON 資料。JSON Schema 定義了一套詞彙和規則,這套詞彙和規則用來定義 JSON 後設資料,且後設資料也是透過 JSON 資料形式表達的。JSON 後設資料定義了 JSON 資料需要滿足的規範,規範包括成員、結構、型別、約束等。我們可以透過它來校驗我們的 JSON 資料是否有效,是否滿足規範。它的作用有些類似於 TypeScript 之於 JavaScript。
它的主要作用:
- 對 JSON 資料格式進行描述
- 提供清晰的人機可讀的檔案
校驗資料
- 自動測試
- 驗證提交資料的質量
JSON Schema 示例
假定我們現在有一個 JSON 資料:
{
"productId": 1,
"productName": "A green door",
"price": 12.50,
"tags": [ "home", "green" ]
}
我們來對應宣告一個 JSON Schema 如下:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/product.schema.json",
"title": "Product",
"description": "A product",
"type": "object",
"properties": {
"productId": {
"description": "The unique identifier for a product",
"type": "integer"
},
"productName": {
"description": "Name of the product",
"type": "string"
},
"price": {
"description": "The price of the product",
"type": "number",
"exclusiveMinimum": 0
},
"tags": {
"description": "Tags for the product",
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"uniqueItems": true
}
},
"required": [ "productId", "productName", "price" ]
}
JSON Schema 關鍵字
先讓我們來看下開頭的幾個關鍵字:
$schema
關鍵字:用來宣告當前 JSON Schema 使用的是哪個版本的 JSON Schema 標準,在宣告 JSON Schema 時儘量新增上它,雖然它不是必須的。注:該關鍵字若使用,其值必須使用官方提供的值,不能自己隨便寫。$id
關鍵字:為JSON Schema例項宣告瞭一個唯一識別符號,並且可以用來宣告一個解析$ref 的 URI 時的基礎 URI。最佳實踐是,每個頂級 JSON Schema 例項都應該將 $id 設定為一個由你自己控制的域內的絕對 URI。title
和description
關鍵字:僅用於描述性的作用,可以省略。type
關鍵字:用於驗證 JSON 資料的第一個約束,在上述例子中,JSON 資料必須是一個物件。
上面幾個關鍵字是針對 Schema 的一些設定和註釋,針對對應的 JSON 資料中每個欄位的描述,都在 properties 中,具體每種格式的欄位相關的描述,我們稍後具體說明。讓我們先看下最後一個關鍵字 required,它用來描述 JSON 資料中哪些欄位是必須的,對應的值必須是陣列格式。比如我們在更新文章時,提交的欄位中文章 id 會是必須的;上面 JSON 資料中 productId 是必須的。
下面讓我們具體看下 JSON 資料中不同型別的欄位對應的描述關鍵字都有哪些。
JSON 資料中每個欄位的描述都對應一個 type,type 對應的基本型別主要包括:
型別 | 描述 |
---|---|
string | 字串型,雙引號包裹的 Unicode 字元和反斜槓跳脫字元 |
number | 數字型,包括整型(int)和浮點數型(float) |
boolean | 布林型,true 或 false |
object | 物件型,無序的鍵:值對集合 |
array | 陣列型,有序的值序列 |
null | 空型 |
其中,針對型別 string、number、array 和 object 有一些相關的關鍵字:
string
關鍵字 描述 schema 有效值 json 資料驗證 maxLength 最大長度 大於等於 0 的整數 字串的長度必須小於等於該值 minLength 最小長度 大於等於 0 的整數 字串的長度必須大於等於該值 pattern 模式 字串,必須是有效的正規表示式 當字串符合正規表示式時,透過驗證 number
關鍵字 描述 Schema 有效值 json 資料驗證 multipleOf 整數倍 大於 0 的 JSON 數 當 JSON 例項的值是其整數倍的時候,透過驗證 maximum 最大值 一個 JSON 數 當 JSON 例項的值小於等於 maximum 的時候,透過驗證 exclusiveMaximum 包含最大值 布林值,必須與 maximum 一起使用 當其為 true 的時候,JSON 例項不能等於 maximum 的值 minimum 最小值 一個 JSON 數 當 JSON 例項的值大於等於 minimum 的時候,透過驗證 exclusiveMinimum 包含最小值 布林值,必須與 minimum 一起使用 當其為 true 的時候,JSON 例項不能等於 minimum 的值 array
關鍵字 描述 Schema 有效值 json 資料驗證 items 定義元素 必須是 Schema 例項物件或者 Schema 例項物件的陣列 用於定義 array 中的元素型別 additionalItems 額外項校驗 布林值或 Schema 例項物件 當 items 為 Schema 例項的陣列,additionalItems 為 false 時,json 資料長度必須小於等於 items 長度,如果 additionalItems 是 Schema 例項,則 items 關鍵字指定的 Schema 例項陣列沒有匹配到的其他元素都要符合該例項 maxItems 長度限制 大於等於 0 的整數 array 例項的長度必須小於等於 maxItems 的值 minItems 長度限制 大於等於 0 的整數 array 例項的長度必須大於等於 minItems 的值 uniqueItems 唯一值 布林值,預設值 false 當 uniqueItems 為 true 的時候,array 例項不能有重複值。 object
關鍵字 描述 Schema 有效值 json 資料驗證 properties 屬性 屬性的值必須都是有效的 Schema 例項物件 用於定義屬性列表 maxProperties 最大屬性個數 大於等於 0 的整數 object 例項的屬性個數必須小於等於 maxProperties 的值 minProperties 最小屬性個數 大於等於 0 的整數 object 例項的屬性個數必須大於等於 minProperties 的值 required 必須屬性 字串陣列,至少必須有一個元素,陣列內不能有重複值 object 例項必須有所有 required 定義的屬性 patternProperties 按屬性名校驗 必須是有效的 Scheme 例項物件 Scheme 例項的每一個屬性的鍵都是一個正規表示式,值都是一個 Schema 例項。 指定符合正規表示式的屬性的校驗規則。 additionalProperties 額外屬性校驗 Scheme 例項物件或布林值 為 false 時不允許擁有除了 properties 和 patternProperties 匹配到的屬性外的屬性,如果為 Scheme 例項,則沒有匹配到的屬性要符合該 Scheme 另外,還有一些通用關鍵字
關鍵字 描述 Schema 有效值 json 資料驗證 enum 資料列舉 必須是陣列,而且陣列裡面的元素至少必須有一個而且不能有重複值。 當 json 例項的值存在於 enum 列表中時,透過驗證 type 定義型別 可以是字串或者字串陣列,取值必須在 JSON 基本型別範圍內 校驗 JSON 例項的型別是否符合定義 allOf 資料驗證 必須是 Schema 例項物件陣列,而且陣列裡面的元素至少必須有一個而且不能有重複 JSON 例項滿足其中所有的 Schema 時,透過驗證 anyOf 資料驗證 同 allOf JSON 例項滿足其中某一個 Schema 時,透過驗證 oneOf 資料驗證 同 allOf JSON 例項剛好只滿足其中某一個 Schema 時,透過驗證 not 資料驗證 必須是個有效的 Schema 例項物件 如果不滿足 JSON Schema 的定義,則透過驗證 const 資料驗證 JSON 基本型別 如果 JSON 例項的值和該關鍵字指定的值相同,則透過校驗。
小結
本次我們主要是初步瞭解了 JSON Schema 和 JSON 的關係,以及 JSON Schema 的一些基礎內容。JSON Schema 的構成主要依託於一些關鍵字,以此來確定一個 JSON 的資料結構描述。看到這裡,可能我們還沒有體會到它的作用,我們會在後續具體來看一下它是如何發揮作用,在哪些場景下為我們提供便利的,敬請期待。
參考: