2023我還不知道的JSON Schema-基礎篇

前端榮耀發表於2023-03-15

什麼是 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。
  • titledescription 關鍵字:僅用於描述性的作用,可以省略。
  • 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資料驗證同 allOfJSON 例項滿足其中某一個 Schema 時,透過驗證
    oneOf資料驗證同 allOfJSON 例項剛好只滿足其中某一個 Schema 時,透過驗證
    not資料驗證必須是個有效的 Schema 例項物件如果不滿足 JSON Schema 的定義,則透過驗證
    const資料驗證JSON 基本型別如果 JSON 例項的值和該關鍵字指定的值相同,則透過校驗。

小結

本次我們主要是初步瞭解了 JSON Schema 和 JSON 的關係,以及 JSON Schema 的一些基礎內容。JSON Schema 的構成主要依託於一些關鍵字,以此來確定一個 JSON 的資料結構描述。看到這裡,可能我們還沒有體會到它的作用,我們會在後續具體來看一下它是如何發揮作用,在哪些場景下為我們提供便利的,敬請期待。


參考:

1.JSON Schema 入門

2.JSON Schema Reference

3.線上 JSON 轉 JSON Schema

相關文章