JSON開發(fā)筆記(三)—— JSON Schema實(shí)戰(zhàn)(中)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末违寞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子偶房,更是在濱河造成了極大的恐慌趁曼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棕洋,死亡現(xiàn)場(chǎng)離奇詭異挡闰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掰盘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門摄悯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愧捕,你說我怎么就攤上這事射众。” “怎么了晃财?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長典蜕。 經(jīng)常有香客問我断盛,道長,這世上最難降的妖魔是什么愉舔? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任钢猛,我火速辦了婚禮,結(jié)果婚禮上轩缤,老公的妹妹穿的比我還像新娘命迈。我一直安慰自己,他們只是感情好火的,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布壶愤。 她就那樣靜靜地躺著,像睡著了一般馏鹤。 火紅的嫁衣襯著肌膚如雪征椒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天湃累,我揣著相機(jī)與錄音勃救,去河邊找鬼碍讨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒙秒,可吹牛的內(nèi)容都是我干的勃黍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼晕讲,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼覆获!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起益兄,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤锻梳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后净捅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疑枯,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年蛔六,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荆永。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡国章,死狀恐怖具钥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情液兽,我是刑警寧澤骂删,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站四啰,受9級(jí)特大地震影響宁玫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柑晒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一欧瘪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匙赞,春花似錦佛掖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坐榆,卻和暖如春撕彤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工羹铅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚀狰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓职员,卻偏偏與公主長得像麻蹋,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焊切,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理扮授,服務(wù)發(fā)現(xiàn),斷路器专肪,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 1. JSON Schema簡介 我們知道刹勃,JSON和XML相比,在很多方面具有更多的優(yōu)勢(shì)嚎尤。未來荔仁,JSON在各方面...
    邱士超閱讀 3,088評(píng)論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法芽死,內(nèi)部類的語法乏梁,繼承相關(guān)的語法,異常的語法关贵,線程的語...
    子非魚_t_閱讀 31,581評(píng)論 18 399
  • 轉(zhuǎn)載: http://www.reibang.com/p/8b428e1d1564# JSON概覽 JSON(Ja...
    朝花夕拾不起來閱讀 2,637評(píng)論 1 37
  • 這星期活法學(xué)的是勞動(dòng)遇骑,書上說勞動(dòng)的喜悅是特別的喜悅,確實(shí)揖曾,勞動(dòng)的喜悅會(huì)讓我們記憶猶新落萎,記得人生的第一桶金還是...
    Miss曲奇閱讀 586評(píng)論 0 0