1. JSON Schema關(guān)鍵字簡介
上篇文章中,我們通過一個(gè)簡單的JSON Schema的例子,簡要地介紹了JSON Schema中經(jīng)常用到的關(guān)鍵字,并介紹了一些在線輔助工具。一般來說,掌握了這些知識(shí)點(diǎn)就可以應(yīng)對(duì)比較常見的需求場(chǎng)景了,但是,如果你需要更多的定制化要求以及更加深入的細(xì)節(jié)校驗(yàn)的話,那么,我們就需要進(jìn)一步了解更多關(guān)鍵字的用法和使用場(chǎng)景。
2. JSON Schema關(guān)鍵字詳解
例一:涉及的關(guān)鍵字($schema、title、description、type、properties、required)
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "TestInfo",
"description": "some information about test",
"type": "object",
"properties": {
"name": {
"description": "Name of the test",
"type": "string"
}
},
"required": [
"name"
]
}
2.1 $schema
該關(guān)鍵字用于指定JSON Schema版本信息,例一中指定的版本為:draft-04
。該關(guān)鍵字是可以省略的,當(dāng)前最新版本為draft-06
。注意:該關(guān)鍵字的值必須使用官方提供的值,不能自己隨便寫。
2.2 title和description
這兩個(gè)關(guān)鍵字都是用來描述對(duì)應(yīng)的JSON元素的,唯一的區(qū)別在于,title相對(duì)來說,更加簡潔,而description更加傾向于詳細(xì)描述相關(guān)信息。當(dāng)然了,這兩個(gè)關(guān)鍵字都是可以省略的。我們看到例一中最外層的title和description是對(duì)待校驗(yàn)JSON對(duì)象的描述,而其中,name元素之下的description其實(shí)是對(duì)待校驗(yàn)JSON對(duì)象的一級(jí)key(name)的描述,當(dāng)然,你也可以對(duì)name增加title信息。
2.3 type
該關(guān)鍵字用于限定待校驗(yàn)JSON元素所屬的數(shù)據(jù)類型,例一中最外層的type關(guān)鍵字值為object,即表示待校驗(yàn)JSON數(shù)據(jù)為一個(gè)JSON對(duì)象,而name下的type關(guān)鍵字值為string,即表示待校驗(yàn)JSON對(duì)象中的一級(jí)key(name)的數(shù)據(jù)類型為string。那么,按照這個(gè)要求,下面這個(gè)JSON數(shù)據(jù)是符合要求的。
{
"name": "hello first blog"
}
而,下面這個(gè)JSON數(shù)據(jù)是不符合要求的,因?yàn)閚ame的類型為integer或者number,而不是string。
{
"name": 520
}
2.3.1 type常見取值
那么,type又有哪些取值呢?當(dāng)type取值為string類型的時(shí)候,是否還可以添加其他一些附加限制條件呢?我們接下來會(huì)按照type的不同取值一點(diǎn)點(diǎn)分析涉及到的關(guān)鍵字含義及用法。首先,我們來看一下,type常見的取值。具體如下:
type取值 | 對(duì)應(yīng)的Java數(shù)據(jù)類型 |
---|---|
object | java.lang.Object |
array | java.util.List |
integer | int(java.lang.Integer) |
number | float(java.lang.Float)或int |
null | null |
boolean | java.lang.Boolean |
string | java.lang.String |
在上表中,我們采用了和Java數(shù)據(jù)類型對(duì)比分析的形式給出了type的常見取值,接下來,我們會(huì)分析當(dāng)type為不同取值時(shí),可能涉及的關(guān)鍵字含義和用法。
2.3.2 從type的不同取值說起
(1)當(dāng)type取值為object時(shí),涉及的關(guān)鍵字:properties、required、minProperties、maxProperties、propertyNames、dependencies、patternProperties、additionalProperties
- properties
該關(guān)鍵字的值是一個(gè)對(duì)象。
用于指定JSON對(duì)象中的各種不同key應(yīng)該滿足的校驗(yàn)邏輯,如果待校驗(yàn)JSON對(duì)象中所有值都能夠通過該關(guān)鍵字值中定義的對(duì)應(yīng)key的校驗(yàn)邏輯,每個(gè)key對(duì)應(yīng)的值,都是一個(gè)JSON Schema,則待校驗(yàn)JSON對(duì)象通過校驗(yàn)。從這里,我們可以看到,只要待校驗(yàn)JSON對(duì)象的所有key分別都通過對(duì)應(yīng)的JSON Schema的校驗(yàn)檢測(cè),這個(gè)對(duì)象才算是通過校驗(yàn)。
另外,需要注意的是,省略該關(guān)鍵字和該關(guān)鍵字的值為空對(duì)象,具有相同效果。例如:
"properties": {
"id": {
"description": "The unique identifier for a book",
"type": "integer",
"minimum": 1
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
}
- required
該關(guān)鍵字的值是一個(gè)數(shù)組,而數(shù)組中的元素必須是字符串,而且必須是唯一的。
該關(guān)鍵字限制了JSON對(duì)象中必須包含哪些一級(jí)key。如果一個(gè)JSON對(duì)象中含有required關(guān)鍵字所指定的所有一級(jí)key,則該JSON對(duì)象能夠通過校驗(yàn)。
另外,需要注意的是,省略該關(guān)鍵字和該關(guān)鍵字的值為空數(shù)組,具有相同效果。例如:
"required": [
"id",
"name",
"price"
]
- minProperties、maxProperties
這兩個(gè)關(guān)鍵字的值都是非負(fù)整數(shù)。
指定了待校驗(yàn)JSON對(duì)象中一級(jí)key的個(gè)數(shù)限制,minProperties指定了待校驗(yàn)JSON對(duì)象可以接受的最少一級(jí)key的個(gè)數(shù),而maxProperties指定了待校驗(yàn)JSON對(duì)象可以接受的最多一級(jí)key的個(gè)數(shù)。
另外,需要注意的是,省略minProperties關(guān)鍵字和該關(guān)鍵字的值為0,具有相同效果。而,如果省略maxProperties關(guān)鍵字則表示對(duì)一級(jí)key的最大個(gè)數(shù)沒有限制。例如,如果限制一個(gè)JSON對(duì)象的一級(jí)key的最大個(gè)數(shù)為5,最小個(gè)數(shù)為1,則JSON Schema如下:
"minProperties": 1,
"maxProperties": 5
- propertyNames
注意:該關(guān)鍵字,官方說明中支持,但是,有可能你使用的平臺(tái)或者第三方工具不支持哦。所以,使用需謹(jǐn)慎。
該關(guān)鍵字的值是一個(gè)有效的JSON Schema。
如果待校驗(yàn)JSON對(duì)象中的每個(gè)一級(jí)key都能通過該關(guān)鍵字指定的JSON Schema的校驗(yàn),那么才認(rèn)為待校驗(yàn)的JSON對(duì)象通過校驗(yàn)。注意,待校驗(yàn)JSON對(duì)象的一級(jí)key都是string類型。
另外,需要注意的是,省略該關(guān)鍵字和該關(guān)鍵字的值為空J(rèn)SON Schema,具有相同效果。
- patternProperties
該關(guān)鍵字的值是一個(gè)JSON對(duì)象,該JSON對(duì)象的每一個(gè)一級(jí)key都是一個(gè)正則表達(dá)式,value都是一個(gè)JSON Schema。
只有待校驗(yàn)JSON對(duì)象中的一級(jí)key,通過與之匹配的patternProperties中的一級(jí)正則表達(dá)式,對(duì)應(yīng)的JSON Schema的校驗(yàn),才算通過校驗(yàn)。例如,如果patternProperties對(duì)應(yīng)的值如下:
"patternProperties": {
"^a": {
"type": "number"
},
"^b": {
"type": "string"
}
}
上面的JSON Schema表示,待校驗(yàn)JSON對(duì)象中,所有以a開頭的一級(jí)key的value都必須是number,所有以b開頭的一級(jí)key的value都必須是string。
- additionalProperties
該關(guān)鍵字的值是一個(gè)JSON Schema。
如果待校驗(yàn)JSON對(duì)象中存在,既沒有在properties中被定義,又沒有在patternProperties中被定義,那么這些一級(jí)key必須通過additionalProperties的校驗(yàn)。
- dependencies
待定。。。
- 完整示例:
{
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a book",
"type": "integer",
"minimum": 1
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
},
"patternProperties": {
"^a": {
"type": "number"
},
"^b": {
"type": "string"
}
},
"additionalProperties": {
"type": "number"
},
"minProperties": 1,
"maxProperties": 5,
"required": [
"id",
"name",
"price"
]
}
(2)當(dāng)type取值為array時(shí),涉及的關(guān)鍵字:items、additionalItems、minItems、maxItems、uniqueItems、contains
- items
該關(guān)鍵字的值是一個(gè)有效的JSON Schema或者一組有效的JSON Schema。
當(dāng)該關(guān)鍵字的值是一個(gè)有效的JSON Schema時(shí),只有待校驗(yàn)JSON數(shù)組中的所有元素均通過校驗(yàn),整個(gè)數(shù)組才算通過校驗(yàn)。例如,如果items關(guān)鍵字的具體定義如下:
{
"type": "array",
"items": {
"type": "string",
"minLength": 5
}
}
上面的JSON Schema的意思是,待校驗(yàn)JSON數(shù)組的元素都是string類型,且最小可接受長度是5。那么下面這個(gè)JSON數(shù)組明顯是符合要求的,具體內(nèi)容如下:
["myhome", "green"]
那么下面這個(gè)JSON數(shù)據(jù)則是不符合要求,因?yàn)榈谝粋€(gè)元素的長度小于5,具體內(nèi)容如下:
["home", "green"]
當(dāng)該關(guān)鍵字的值是一組有效的JSON Schema時(shí),只有待校驗(yàn)JSON數(shù)組的所有元素通過items的值中對(duì)應(yīng)位置上的JSON Schema的校驗(yàn),那么,整個(gè)待校驗(yàn)JSON數(shù)組才算通過校驗(yàn)。
這里需要注意的是,如果items定義的有效的JSON Schema的數(shù)量和待校驗(yàn)JSON數(shù)組中元素的數(shù)量不一致,那么就要采用“取小原則”。即,如果items定義了3個(gè)JSON Schema,但是待校驗(yàn)JSON數(shù)組只有2個(gè)元素,這時(shí),只要待校驗(yàn)JSON數(shù)組的前兩個(gè)元素能夠分別通過items中的前兩個(gè)JSON Schema的校驗(yàn),那么,我們認(rèn)為待校驗(yàn)JSON數(shù)組通過了校驗(yàn)。而,如果待校驗(yàn)JSON數(shù)組有4個(gè)元素,這時(shí),只要待校驗(yàn)JSON數(shù)組的前三個(gè)元素能夠通過items中對(duì)應(yīng)的JSON Schema的校驗(yàn),我們就認(rèn)為待校驗(yàn)JSON數(shù)組通過了校驗(yàn)。
例如,如果items的值如下:
{
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
},
{
"type": "string"
}
]
}
上面的JSON Schema指出了待校驗(yàn)JSON數(shù)組應(yīng)該滿足的條件,數(shù)組的第一個(gè)元素是string類型,且最小可接受長度為5,數(shù)組的第二個(gè)元素是number類型,最小可接受的值為10,數(shù)組的第三個(gè)元素是string類型。那么下面這兩個(gè)JSON數(shù)組明顯是符合要求的,具體內(nèi)容如下:
["green", 10, "good"]
["helloworld", 11]
下面這兩個(gè)JSON數(shù)組卻是不符合要求的,具體內(nèi)容如下:
["green", 9, "good"]
["good", 12]
- additionalItems
該關(guān)鍵字的值是一個(gè)有效的JSON Schema。
需要注意的是,該關(guān)鍵字只有在items關(guān)鍵字的值為一組有效的JSON Schema的時(shí)候,才可以使用,用于規(guī)定超出items中JSON Schema總數(shù)量之外的待校驗(yàn)JSON數(shù)組中的剩余的元素應(yīng)該滿足的校驗(yàn)邏輯。當(dāng)然了,只有這些剩余的所有元素都滿足additionalItems的要求時(shí),待校驗(yàn)JSON數(shù)組才算通過校驗(yàn)。
其實(shí),你可以這么理解,當(dāng)items的值為一組有效的JOSN Schema的時(shí)候,一般可以和additionalItems關(guān)鍵字組合使用,items用于規(guī)定對(duì)應(yīng)位置上應(yīng)該滿足的校驗(yàn)邏輯,而additionalItems用于規(guī)定超出items校驗(yàn)范圍的所有剩余元素應(yīng)該滿足的條件。如果二者同時(shí)存在,那么只有待校驗(yàn)JSON數(shù)組同時(shí)通過二者的校驗(yàn),才算真正地通過校驗(yàn)。
另外,需要注意的是,如果items只是一個(gè)有效的JSON Schema,那么就不能使用additionalItems,原因也很簡單,因?yàn)閕tems為一個(gè)有效的JSON Schema的時(shí)候,其規(guī)定了待校驗(yàn)JSON數(shù)組所有元素應(yīng)該滿足的校驗(yàn)邏輯。additionalItems已經(jīng)沒有用武之地了。
最后,同樣強(qiáng)調(diào)一下,省略該關(guān)鍵字和該關(guān)鍵字的值為空J(rèn)SON Schema,具有相同效果。
如果一個(gè)additionalItems的值如下:
{
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
}
],
"additionalItems": {
"type": "string",
"minLength": 2
}
}
上面的JSON Schema的意思是,待校驗(yàn)JSON數(shù)組第一個(gè)元素是string類型,且可接受的最短長度為5個(gè)字符,第二個(gè)元素是number類型,且可接受的最小值為10,剩余的其他元素是string類型,且可接受的最短長度為2。那么,下面三個(gè)JSON數(shù)組是能夠通過校驗(yàn)的,具體內(nèi)容如下:
["green", 10, "good"]
["green", 11]
["green", 10, "good", "ok"]
下面JSON數(shù)組是無法通過校驗(yàn)的,具體內(nèi)容如下:
["green", 10, "a"]
["green", 10, "ok", 2]
- minItems、maxItems
這兩個(gè)關(guān)鍵字的值都是非負(fù)整數(shù)。
指定了待校驗(yàn)JSON數(shù)組中元素的個(gè)數(shù)限制,minItems指定了待校驗(yàn)JSON數(shù)組可以接受的最少元素個(gè)數(shù),而maxItems指定了待校驗(yàn)JSON數(shù)組可以接受的最多元素個(gè)數(shù)。
另外,需要注意的是,省略minItems關(guān)鍵字和該關(guān)鍵字的值為0,具有相同效果。而,如果省略maxItems關(guān)鍵字則表示對(duì)元素的最大個(gè)數(shù)沒有限制。例如,如果限制一個(gè)JSON數(shù)組的元素的最大個(gè)數(shù)為5,最小個(gè)數(shù)為1,則JSON Schema如下:
"minItems": 1,
"maxItems": 5
- uniqueItems
該關(guān)鍵字的值是一個(gè)布爾值,即boolean(true、false)。
當(dāng)該關(guān)鍵字的值為true時(shí),只有待校驗(yàn)JSON數(shù)組中的所有元素都具有唯一性時(shí),才能通過校驗(yàn)。當(dāng)該關(guān)鍵字的值為false時(shí),任何待校驗(yàn)JSON數(shù)組都能通過校驗(yàn)。
另外,需要注意的是,省略該關(guān)鍵字和該關(guān)鍵字的值為false時(shí),具有相同的效果。例如:
"uniqueItems": true
- contains
注意:該關(guān)鍵字,官方說明中支持,但是,有可能你使用的平臺(tái)或者第三方工具不支持哦。所以,使用需謹(jǐn)慎。
該關(guān)鍵字的值是一個(gè)有效的JSON Schema。
只有待校驗(yàn)JSON數(shù)組中至少有一個(gè)元素能夠通過該關(guān)鍵字指定的JSON Schema的校驗(yàn),整個(gè)數(shù)組才算通過校驗(yàn)。
另外,需要注意的是,省略該關(guān)鍵字和該關(guān)鍵字的值為空J(rèn)SON Schema具有相同效果。
- 完整示例:
{
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
}
],
"additionalItems": {
"type": "string",
"minLength": 2
},
"minItems": 1,
"maxItems": 5,
"uniqueItems": true
}
(3)當(dāng)type取值為integer或number時(shí),涉及的關(guān)鍵字:multipleOf、maximum、exclusiveMaximum、minimum、exclusiveMinimum
我們首先來回顧一下integer和number的區(qū)別,integer相當(dāng)于Java中的int類型,而number相當(dāng)于Java中的int或float類型。
- multipleOf
該關(guān)鍵字的值是一個(gè)大于0的number,即可以是大于0的int,也可以是大于0的float。
只有待校驗(yàn)的值能夠被該關(guān)鍵字的值整除,才算通過校驗(yàn)。
如果含有該關(guān)鍵字的JSON Schema如下:
{
"type": "integer",
"multipleOf": 2
}
那么,2、4、6都是可以通過校驗(yàn)的,但是,3、5、7都是無法通過校驗(yàn)的,當(dāng)然了,2.0、4.0也是無法通過校驗(yàn)的,但是,并不是因?yàn)閙ultipleOf關(guān)鍵字,而是因?yàn)閠ype關(guān)鍵字。
如果含有multipleOf關(guān)鍵字的JSON Schema如下:
{
"type": "number",
"multipleOf": 2.0
}
那么,2、2.0、4、4.0都是可以通過校驗(yàn)的,但是,3、3.0、3、3.0都是無法通過校驗(yàn)的。
另外,需要注意的是,省略該關(guān)鍵字則不對(duì)待校驗(yàn)數(shù)值進(jìn)行該項(xiàng)校驗(yàn)。
- maximum
該關(guān)鍵字的值是一個(gè)number,即可以是int,也可以是float。
該關(guān)鍵字規(guī)定了待校驗(yàn)元素可以通過校驗(yàn)的最大值。
省略該關(guān)鍵字,即表示對(duì)待校驗(yàn)元素的最大值沒有要求。
- exclusiveMaximum
該關(guān)鍵字的值是一個(gè)boolean。
該關(guān)鍵字通常和maximum一起使用,當(dāng)該關(guān)鍵字的值為true時(shí),表示待校驗(yàn)元素必須小于maximum指定的值;當(dāng)該關(guān)鍵字的值為false時(shí),表示待校驗(yàn)元素可以小于或者等于maximum指定的值。
需要注意的是,省略該關(guān)鍵字和該關(guān)鍵字的值為false,具有相同效果。例如:
{
"type": "number",
"maximum": 12.3,
"exclusiveMaximum": true
}
- minimum、exclusiveMinimum
minimum、exclusiveMinimum關(guān)鍵字的用法和含義與maximum、exclusiveMaximum相似。唯一的區(qū)別在于,一個(gè)約束了待校驗(yàn)元素的最小值,一個(gè)約束了待校驗(yàn)元素的最大值。這里就不展開解釋了。
- 完整示例:
{
"type": "number",
"multipleOf": 0.5,
"maximum": 12.5,
"exclusiveMaximum": true,
"minimum": 2.5,
"exclusiveMinimum": true
}
(4)當(dāng)type取值為string時(shí),涉及的關(guān)鍵字:maxLength、minLength、pattern、format
- maxLength
該關(guān)鍵字的值是一個(gè)非負(fù)整數(shù)。
該關(guān)鍵字規(guī)定了待校驗(yàn)JSON元素可以通過校驗(yàn)的最大長度,即待校驗(yàn)JSON元素的最大長度必須小于或者等于該關(guān)鍵字的值。
另外,需要注意的是,如果省略該關(guān)鍵字則表示對(duì)待校驗(yàn)元素的最大長度沒有限制。
- minLength
該關(guān)鍵字的值是一個(gè)非負(fù)整數(shù)。
該關(guān)鍵字規(guī)定了待校驗(yàn)JSON元素可以通過校驗(yàn)的最小長度,即待校驗(yàn)JSON元素的最小長度必須大于或者等于該關(guān)鍵字的值。
另外,需要注意的是,如果省略該關(guān)鍵字和該關(guān)鍵字的值為0,具有相同效果。
- pattern
該關(guān)鍵字的值是一個(gè)正則表達(dá)式。
只有待校驗(yàn)JSON元素符合該關(guān)鍵字指定的正則表達(dá)式,才算通過校驗(yàn)。
- format
該關(guān)鍵字的值只能是以下取值:
date-time(時(shí)間格式)、email(郵件格式)、hostname(網(wǎng)站地址格式)、ipv4、ipv6、uri、uri-reference、uri-template、json-pointer。
如果待校驗(yàn)的JSON元素正好是一個(gè)郵箱地址,那么,我們就可以使用format關(guān)鍵字進(jìn)行校驗(yàn),而不必通過pattern關(guān)鍵字指定復(fù)雜的正則表達(dá)式進(jìn)行校驗(yàn)。例如:
{
"type": "string",
"format": "email"
}
- 完整示例:
{
"type": "string",
"pattern": "^#([0-9a-fA-F]{6}$",
"maxLength": 6,
"minLength": 6
}
(5)全類型可用,即不局限于某個(gè)type,涉及的關(guān)鍵字:enum、const、allOf、anyOf、oneOf、not、default
- enum
該關(guān)鍵字的值是一個(gè)數(shù)組,該數(shù)組至少要有一個(gè)元素,且數(shù)組內(nèi)的每一個(gè)元素都是唯一的。
如果待校驗(yàn)的JSON元素和數(shù)組中的某一個(gè)元素相同,則通過校驗(yàn)。否則,無法通過校驗(yàn)。
注意,該數(shù)組中的元素值可以是任何值,包括null。省略該關(guān)鍵字則表示無須對(duì)待校驗(yàn)元素進(jìn)行該項(xiàng)校驗(yàn)。例如:
{
"type": "number",
"enum": [2, 3, null, "hello"]
}
- const
該關(guān)鍵字的值可以是任何值,包括null。
如果待校驗(yàn)的JSON元素的值和該關(guān)鍵字指定的值相同,則通過校驗(yàn)。否則,無法通過校驗(yàn)。
省略該關(guān)鍵字則表示無須對(duì)待校驗(yàn)元素進(jìn)行該項(xiàng)校驗(yàn)。
注意,該關(guān)鍵字部分第三方工具,并不支持。
- allOf
該關(guān)鍵字的值是一個(gè)非空數(shù)組,數(shù)組里面的每個(gè)元素都必須是一個(gè)有效的JSON Schema。
只有待校驗(yàn)JSON元素通過數(shù)組中所有的JSON Schema校驗(yàn),才算真正通過校驗(yàn)。
- anyOf
該關(guān)鍵字的值是一個(gè)非空數(shù)組,數(shù)組里面的每個(gè)元素都必須是一個(gè)有效的JSON Schema。
如果待校驗(yàn)JSON元素能夠通過數(shù)組中的任何一個(gè)JSON Schema校驗(yàn),就算通過校驗(yàn)。
- oneOf
該關(guān)鍵字的值是一個(gè)非空數(shù)組,數(shù)組里面的每個(gè)元素都必須是一個(gè)有效的JSON Schema。
如果待校驗(yàn)JSON元素能且只能通過數(shù)組中的某一個(gè)JSON Schema校驗(yàn),才算真正通過校驗(yàn)。不能通過任何一個(gè)校驗(yàn)和能通過兩個(gè)及以上的校驗(yàn),都不算真正通過校驗(yàn)。
- not
該關(guān)鍵字的值是一個(gè)JSON Schema。
只有待校驗(yàn)JSON元素不能通過該關(guān)鍵字指定的JSON Schema校驗(yàn)的時(shí)候,待校驗(yàn)元素才算通過校驗(yàn)。
- default
該關(guān)鍵字的值是沒有任何要求的。
該關(guān)鍵字常常用來指定待校驗(yàn)JSON元素的默認(rèn)值,當(dāng)然,這個(gè)默認(rèn)值最好是符合要求的,即能夠通過相應(yīng)的JSON Schema的校驗(yàn)。
另外,需要注意的是,該關(guān)鍵字除了提示作用外,并不會(huì)產(chǎn)生任何實(shí)質(zhì)性的影響。
(6)再說type關(guān)鍵字
需要特別注意的是,type關(guān)鍵字的值可以是一個(gè)string,也可以是一個(gè)數(shù)組。
如果type的值是一個(gè)string,則其值只能是以下幾種:null、boolean、object、array、number、string、integer。
如果type的值是一個(gè)數(shù)組,則數(shù)組中的元素都必須是string,且其取值依舊被限定為以上幾種。只要帶校驗(yàn)JSON元素是其中的一種,則通過校驗(yàn)。
3. JSON Schema比較復(fù)雜的示例:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "book info",
"description": "some information about book",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a book",
"type": "integer",
"minimum": 1
},
"name": {
"type": "string",
"pattern": "^#([0-9a-fA-F]{6}$",
"maxLength": 6,
"minLength": 6
},
"price": {
"type": "number",
"multipleOf": 0.5,
"maximum": 12.5,
"exclusiveMaximum": true,
"minimum": 2.5,
"exclusiveMinimum": true
},
"tags": {
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
}
],
"additionalItems": {
"type": "string",
"minLength": 2
},
"minItems": 1,
"maxItems": 5,
"uniqueItems": true
}
},
"minProperties": 1,
"maxProperties": 5,
"required": [
"id",
"name",
"price"
]
}
注意,以上JSON Schema只是為了展示部分關(guān)鍵字的用法,可能和實(shí)際應(yīng)用略有不同。
官方的參考文檔如下:http://json-schema.org/latest/json-schema-validation.html