本文地址:Json Schema 是什麼?git
簡單說,Json Schema
其實就是一個標準的 Json 串,它以一個 Json 串來描述咱們須要的數據規範,而且支持註釋以及驗證 Json 文檔,即咱們能夠用 Json Schema 來驗證所給的 Json 串是否知足咱們須要的數據格式規範。github
一樣能用來表示數據的還有一種格式 XML,爲何 Json Schema 恰恰要用 Json 來進行表示數據呢?對於機器,其實這兩種方式是沒有區別的,機器只要你把標準給了它,它都能用很快的速度識別出來(相對於咱們人),可是 XML 對於人識別就太不友好了。好比,假設咱們須要描述一個班級的兩我的:web
對於 XML:json
<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 的優點立馬就顯現出來了。ide
Json Schema 在咱們平時的工做中最經常使用的有兩個,一個就是上面說的用於驗證 Json 串的合法性;另外一個就是用於定義咱們的 API,定義好 API 後,咱們能夠直接用工具生成咱們的 API,這樣利於咱們對 API 的維護。svg
好比,咱們定義的 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 中ui
$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 是不是合規的了。好比:code
{ "id": 1, "name": "watermelon" }
顯然,這個 Json 缺乏了一個屬性 price,因此它不合規。
{ "id": 1, "name": ["knife", "spoon"], "price": 4 }
這個 Json 的 name 屬性是一個數組,咱們上面規定 name 只能是 String,顯然這個也不是合規的。
{ "id": 1, "name": "watermelon", "price": 4 }
這個,就知足了上面定義的全部規則,所以這個是一個合規的 Json。
其實,使用咱們上面的 Json Schema 便能進行 API 的定義了,只不過是定義 API 的話可能還須要更多的支持。好比,對於 Java,咱們須要能實現 extend 等關鍵字的支持,還須要能進行枚舉 enum 類型等的定義。這裏只簡單使用上述的內容顯然不夠了,咱們還須要擴充一些關鍵字的使用。
目前,你們使用最多的將 Json Schema 轉換爲 Java Bean 的一個庫是 jsonschema2pojo,後面我將依託這個庫支持的內容對 Json Schema 的格式進行深刻解析,此庫支持的也是比較通用的。