Json Schema 是什么?


本文地址:Json Schema 是什么?

簡單說,Json Schema 其實就是一個標准的 Json 串,它以一個 Json 串來描述我們需要的數據規范,並且支持注釋以及驗證 Json 文檔,即我們可以用 Json Schema 來驗證所給的 Json 串是否滿足我們需要的數據格式規范。

同樣能用來表示數據的還有一種格式 XML,為什么 Json Schema 偏偏要用 Json 來進行表示數據呢?對於機器,其實這兩種方式是沒有區別的,機器只要你把標准給了它,它都能用很快的速度識別出來(相對於我們人),但是 XML 對於人識別就太不友好了。比如,假設我們需要描述一個班級的兩個人:

對於 XML:

<class>
	<name>實驗1班</name>
	<no>1801</no>
	<students>
	    <student>
	        <name>張三</name>
	        <sex>女</sex>
	    </student>
	    <student>
	        <name>李四</name>
	        <sex>男</sex>
	    </student>
	</students>
</class>

使用 Json:

{
  "class": {
    "name": "實驗1班",
    "no": "1801",
    "students": {
      "student": [
        {
          "name": "張三",
          "sex": "女"
        },
        {
          "name": "李四",
          "sex": "男"
        }
      ]
    }
  }
}

有沒有覺得 Json 立馬秒殺 XML?這里可能感覺還不是很明顯,這是因為層級比較少,層級再多之后,Json 的優勢立馬就顯現出來了。

Json Schema 在我們平時的工作中最常用的有兩個,一個就是上面說的用於驗證 Json 串的合法性;另一個就是用於定義我們的 API,定義好 API 后,我們可以直接用工具生成我們的 API,這樣利於我們對 API 的維護。

驗證 Json 串的合法性

比如,我們定義的 Json Schema 為:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Product",
    "description": "A product from Acme's catalog",
    "type": "object",
    "properties": {
        "id": {
            "description": "The unique identifier for a product",
            "type": "integer"
        },
        "name": {
            "description": "Name of the product",
            "type": "string"
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }
    },
    "required": ["id", "name", "price"]
}

在上述 Json Schema 中

  • 最上面的 $shcema 是一個關鍵字,它表示我們所定義的 Schema 和 http://json-schema.org/draft-04/schema#(Json Schema 的 v4 規范)是一致的
  • title 指的是標題。
  • description 用於描述我們所定義的 Schema,上述表明我們定義的是一個來自 Acme 目錄的商品。
  • type 表示我們定義的是一個 object 對象。
  • properties 中就是 Schema 的屬性了,這里面的是核心。我們可以看到該 Schema 一共有三個屬性,分別是 id(integer), name(string), prince(number)
  • 最后的 required 表明三個屬性都是必須的。

給定了上述 Schema,我們就可以驗證給定的 Json 是否是合規的了。比如:

{
  "id": 1,
  "name": "watermelon"
}

顯然,這個 Json 缺少了一個屬性 price,所以它不合規。

{
  "id": 1,
  "name": ["knife", "spoon"],
  "price": 4
}

這個 Json 的 name 屬性是一個數組,我們上面規定 name 只能是 String,顯然這個也不是合規的。

{
  "id": 1,
  "name": "watermelon",
  "price": 4
}

這個,就滿足了上面定義的所有規則,因此這個是一個合規的 Json。

定義 API

其實,使用我們上面的 Json Schema 便能進行 API 的定義了,只不過是定義 API 的話可能還需要更多的支持。比如,對於 Java,我們需要能實現 extend 等關鍵字的支持,還需要能進行枚舉 enum 類型等的定義。這里只簡單使用上述的內容顯然不夠了,我們還需要擴充一些關鍵字的使用。

目前,大家使用最多的將 Json Schema 轉換為 Java Bean 的一個庫是 jsonschema2pojo,后面我將依托這個庫支持的內容對 Json Schema 的格式進行深入解析,此庫支持的也是比較通用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM