本文地址: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 的格式進行深入解析,此庫支持的也是比較通用的。