1. JSON Schema簡介
我們知道晦墙,JSON和XML相比悦昵,在很多方面具有更多的優(yōu)勢。未來晌畅,JSON在各方面取代XML但指,很有可能就是歷史大勢所趨。了解XML的都知道抗楔,XML Schema是以XML語言為基礎(chǔ)棋凳,用于描述XML文檔的結(jié)構(gòu)以及校驗XML文檔內(nèi)容,也就是我們常常見到的XSD(XML Schema Definition)文件连躏。
和XML Schema類似剩岳,JSON Schema是基于JSON格式,用于定義JSON數(shù)據(jù)結(jié)構(gòu)以及校驗JSON數(shù)據(jù)內(nèi)容入热。JSON Schema官網(wǎng)地址:http://json-schema.org/
2. 從一個簡單例子開始
假如存在一份JSON數(shù)據(jù)拍棕,具體內(nèi)容如下:
{
"id": 520,
"name": "hello first blog",
"price": 25.5
}
其中,id表示圖書的ID勺良,name表示圖書的書名绰播,price表示圖書的售價。如果你是圖書館的管理員尚困,雇了很多兼職人員幫你手動錄入圖書館內(nèi)所有的圖書信息蠢箩。格式和上面的JSON保持一致,并且為了避免兼職人員失誤錄入臟數(shù)據(jù)事甜,你做了如下額外要求:
- id從1開始谬泌,且只能為整數(shù)
- name的長度應(yīng)該大于0,但是小于等于50
- price必須大于0逻谦,可以為整數(shù)掌实,也可以為小數(shù)
- 每本圖書三個屬性(id、name跨跨、price)必須都有值
試想潮峦,如果圖書館有幾千本甚至上萬本圖書囱皿,每個兼職人員都把自己錄入的信息匯總給你,你做最后的把關(guān)和審核忱嘹,這個工作量是非常巨大的嘱腥,而且很容易出現(xiàn)失誤。所以拘悦,我們采用另一種自動化的方案齿兔,即通過JSON Schema來校驗錄入的JSON數(shù)據(jù)的合法性。
如果將上面所有的要求都寫入JSON Schema文件础米,其內(nèi)容如下:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "BookInfo",
"description": "some information about book",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a book",
"type": "integer",
"minimum": 1
},
"name": {
"description": "Name of the book",
"type": "string",
"maxLength": 50,
"minLength": 1
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
},
"required": [
"id",
"name",
"price"
]
}
我們可以看到分苇,JSON Schema實際上就是一個JSON文件,只不過其表示的信息內(nèi)容是對另一個JSON文件結(jié)構(gòu)和內(nèi)容的約束屁桑。
3. JSON Schema關(guān)鍵字
要想完全理解上文中的JSON Schema文件內(nèi)容医寿,我們首先需要了解JSON Schema中關(guān)鍵字的含義和作用。JSON Schema中比較常見的關(guān)鍵字如下:
關(guān)鍵字 | 描述 |
---|---|
$schema | 表示該JSON Schema文件遵循的規(guī)范 |
title | 為該JSON Schema文件提供一個標(biāo)題 |
description | 關(guān)于該JSON Schema文件的描述信息 |
type | 表示待校驗元素的類型(例如蘑斧,最外層的type表示待校驗的是一個JSON對象靖秩,內(nèi)層type分別表示待校驗的元素類型為,整數(shù)竖瘾,字符串沟突,數(shù)字) |
properties | 定義待校驗的JSON對象中,各個key-value對中value的限制條件 |
required | 定義待校驗的JSON對象中捕传,必須存在的key |
minimum | 用于約束取值范圍惠拭,表示取值范圍應(yīng)該大于或等于minimum |
exclusiveMinimum | 如果minimum和exclusiveMinimum同時存在,且exclusiveMinimum的值為true庸论,則表示取值范圍只能大于minimum |
maximum | 用于約束取值范圍职辅,表示取值范圍應(yīng)該小于或等于maximum |
exclusiveMaximum | 如果maximum和exclusiveMaximum同時存在,且exclusiveMaximum的值為true葡公,則表示取值范圍只能小于maximum |
multipleOf | 用于約束取值罐农,表示取值必須能夠被multipleOf所指定的值整除 |
maxLength | 字符串類型數(shù)據(jù)的最大長度 |
minLength | 字符串類型數(shù)據(jù)的最小長度 |
pattern | 使用正則表達(dá)式約束字符串類型數(shù)據(jù) |
其中,type的常見取值如下:
type取值 | 對應(yīng)的Java數(shù)據(jù)類型 |
---|---|
array | java.util.List |
boolean | java.lang.Boolean |
integer | int(java.lang.Integer) |
number | float(java.lang.Float)或int |
null | null |
object | java.lang.Object |
string | java.lang.String |
如果你熟悉了上面這些關(guān)鍵字的含義催什,那么讀懂JSON Schema的內(nèi)容也就不再那么困難了,甚至可以嘗試動手寫一些JSON Schema文件了宰睡。
4. JSON Schema在線工具
JSON Schema的在線輔助工具有很多蒲凶,推薦以下幾個:
- 根據(jù)JSON和對應(yīng)的JSON Schema校驗數(shù)據(jù)的正確性:http://json-schema-validator.herokuapp.com/
- 根據(jù)JSON數(shù)據(jù),生成對應(yīng)的JSON Schema數(shù)據(jù):https://jsonschema.net/#/editor
- 根據(jù)JSON數(shù)據(jù)拆内,生成對應(yīng)的JSON Schema數(shù)據(jù):http://schemaguru.snowplowanalytics.com/#