JSON Schema是基于JSON格式,用于定義JSON數(shù)據(jù)結(jié)構(gòu)以及校驗JSON數(shù)據(jù)內(nèi)容。 JSON Schema官網(wǎng)地址:json-schema.org/
個人觀點:JsonSchema類似于xml的schema和DTD的作用,主要是用來規(guī)范json的格式。
關(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的限制條件 |
requiredv | 定義待校驗的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ù) |
JSON Schema關(guān)鍵字詳解
JsonSchema代碼:
{
"$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"
},
"age": {
"description": "age of test",
"type": "integer"
}
},
"required": [
"name"
]
}
詳細(xì)解釋:
$schema:用于指定JSONSchema的版本信息,該值由官方提供,不可亂寫。該關(guān)鍵字可以省略。
title:當(dāng)前schema的標(biāo)題信息??梢允÷?/p>
description:當(dāng)前節(jié)點的描述
type:當(dāng)前節(jié)點的類型,最外層type代表json的最外層是什么樣的類型。例如上方的例子中,符合該JsonSchema的json數(shù)據(jù)必需是一個JsonObject而不能是一個JsonArray
properties:代表當(dāng)前節(jié)點的子節(jié)點信息。例如上方的例子中,符合該JsonSchema的json數(shù)據(jù)的信息可以存在“name”節(jié)點和“age”節(jié)點。按照上面的配置required信息來看,name是必需要有的,而age是非必需的。
required: 是一個數(shù)組類型,代表當(dāng)前節(jié)點下必需的節(jié)點key。例如上方例子中,規(guī)定了json的格式必需要有name節(jié)點。
符合上述JsonSchema的json數(shù)據(jù)如下:
第一種(不含有age節(jié)點,只含有name一個節(jié)點或者name及其若干個節(jié)點):
{ "name": "shaofeer"}
第二種(含有age節(jié)點,age節(jié)點的值必需為integer類型):
{ "name": "shaofeer", "age": 123, "create_time": "2019-12-12"}
type的常用取值
type取值 | 對應(yīng)的python數(shù)據(jù)類型 |
---|---|
object | Object |
array | List |
integer | int |
number | float或int |
null | None |
boolean | Boolean |
string | String |
關(guān)鍵字詳解
最外層type為object時
properties
該關(guān)鍵字的值是一個對象。
用于指定JSON對象中的各種不同key應(yīng)該滿足的校驗邏輯,如果待校驗JSON對象中所有值都能夠通過該關(guān)鍵字值中定義的對應(yīng)key的校驗邏輯, 每個key對應(yīng)的值,都是一個JSON Schema,則待校驗JSON對象通過校驗。 從這里,我們可以看到,只要待校驗JSON對象的所有key分別都通過對應(yīng)的JSON Schema的校驗檢測,這個對象才算是通過校驗。
"properties": {
"name": {
"description": "姓名必須由2-3個字組成",
"type": "string",
"maxLength": 3,
"minLength": 2
},
"age": {
"description": "年齡必須大于18歲。并且不能超過60歲",
"type": "integer",
"minimum": 18,
"maximum": 60
}
}
解釋:**每個key對應(yīng)的值,都是一個JSON Schema:**例如上方例子中,每一個key(name/age)對應(yīng)的值都是一個JSONSchema,JSONSchema中的關(guān)鍵字及描述都可以使用。
required
該關(guān)鍵字的值是一個數(shù)組,而數(shù)組中的元素必須是字符串,而且必須是唯一的。
該關(guān)鍵字限制了JSON對象中必須包含哪些一級key。 如果一個JSON對象中含有required關(guān)鍵字所指定的所有一級key,則該JSON對象能夠通過校驗。
"required": ["id","name","price"]
minProperties、maxProperties
這兩個關(guān)鍵字的值都是非負(fù)整數(shù)。規(guī)定最多節(jié)點個數(shù)與最少節(jié)點個數(shù)。
指定了待校驗JSON對象中一級key的個數(shù)限制,minProperties指定了待校驗JSON對象可以接受的最少一級key的個數(shù),而maxProperties指定了待校驗JSON對象可以接受的最多一級key的個數(shù)。
另外,需要注意的是,省略minProperties關(guān)鍵字和該關(guān)鍵字的值為0,具有相同效果。而,如果省略maxProperties關(guān)鍵字則表示對一級key的最大個數(shù)沒有限制。例如,如果限制一個JSON對象的一級key的最大個數(shù)為5,最小個數(shù)為1,則JSON Schema如下:
"minProperties": 1,"maxProperties": 5
patternProperties
該關(guān)鍵字的值是一個對象,該JSON對象的每一個一級key都是一個正則表達(dá)式,value都是一個JSON Schema。 指定符合正則表達(dá)式的key的規(guī)則。 只有待校驗JSON對象中的一級key,通過與之匹配的patternProperties中的一級正則表達(dá)式, 對應(yīng)的JSON Schema的校驗,才算通過校驗。例如,如果patternProperties對應(yīng)的值如下
"patternProperties": {
"^a": {
"type": "number"
},
"^b": {
"type": "string"
}
}
上面的JSON Schema表示,待校驗JSON對象中,所有以a開頭的一級key的value都必須是number,所有以b開頭的一級key的value都必須是string。
additionalProperties
該關(guān)鍵字的值是一個JSON Schema。
如果待校驗JSON對象中存在,既沒有在properties中被定義,又沒有在patternProperties中被定義,那么這些一級key必須通過additionalProperties的校驗。
最外層type為array時
items:
該關(guān)鍵字的值是一個有效的JSON Schema或者一組有效的JSON Schema。
當(dāng)該關(guān)鍵字的值是一個有效的JSON Schema時,只有待校驗JSON數(shù)組中的所有元素均通過校驗,整個數(shù)組才算通過校驗。例如,如果items關(guān)鍵字的具體定義如下:
{
"type": "array",
"items": {
"type": "string",
"minLength": 5
}
}
上面的JSON Schema的意思是,待校驗JSON數(shù)組的元素都是string類型,且最小可接受長度是5。那么下面這個JSON數(shù)組明顯是符合要求的,具體內(nèi)容如下:
["myhome", "green"]
那么下面這個JSON數(shù)據(jù)則是不符合要求,因為第一個元素的長度小于5,具體內(nèi)容如下:
["home", "green"]
以上對于items的介紹是對于所有元素來規(guī)定的。
注意 下面對items的詳解,趨向于每一個元素的規(guī)則。
這里需要注意的是,如果items定義的有效的JSON Schema的數(shù)量和待校驗JSON數(shù)組中元素的數(shù)量不一致,那么就要采用**“取小原則”**。即,如果items定義了3個JSON Schema,但是待校驗JSON數(shù)組只有2個元素,這時,只要待校驗JSON數(shù)組的前兩個元素能夠分別通過items中的前兩個JSON Schema的校驗,那么,我們認(rèn)為待校驗JSON數(shù)組通過了校驗。而,如果待校驗JSON數(shù)組有4個元素,這時,只要待校驗JSON數(shù)組的前三個元素能夠通過items中對應(yīng)的JSON Schema的校驗,我們就認(rèn)為待校驗JSON數(shù)組通過了校驗。
例如,如果items的值如下:
{
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
},
{
"type": "string"
}
]
}
上面的JSON Schema指出了待校驗JSON數(shù)組應(yīng)該滿足的條件,數(shù)組的第一個元素是string類型,且最小可接受長度為5,數(shù)組的第二個元素是number類型,最小可接受的值為10,數(shù)組的第三個元素是string類型。那么下面這兩個JSON數(shù)組明顯是符合要求的,具體內(nèi)容如下:
["green", 10, "good"]["helloworld", 11]
下面這兩個JSON數(shù)組卻是不符合要求的,具體內(nèi)容如下:
["green", 9, "good"]["good", 12]
additionalItems
該關(guān)鍵字的值是一個有效的JSON Schema。主要規(guī)定除了items內(nèi)部規(guī)定的元素之外的元素規(guī)則。只有在items是一個schema數(shù)組的時候才可以使用。
需要注意的是,該關(guān)鍵字只有在items關(guān)鍵字的值為一組有效的JSON Schema的時候,才可以使用,用于規(guī)定超出items中JSON Schema總數(shù)量之外的待校驗JSON數(shù)組中的剩余的元素應(yīng)該滿足的校驗邏輯。當(dāng)然了,只有這些剩余的所有元素都滿足additionalItems的要求時,待校驗JSON數(shù)組才算通過校驗。
其實,你可以這么理解,當(dāng)items的值為一組有效的JOSN Schema的時候,一般可以和additionalItems關(guān)鍵字組合使用,items用于規(guī)定對應(yīng)位置上應(yīng)該滿足的校驗邏輯,而additionalItems用于規(guī)定超出items校驗范圍的所有剩余元素應(yīng)該滿足的條件。如果二者同時存在,那么只有待校驗JSON數(shù)組同時通過二者的校驗,才算真正地通過校驗。
另外,需要注意的是,如果items只是一個有效的JSON Schema,那么就不能使用additionalItems,原因也很簡單,因為items為一個有效的JSON Schema的時候,其規(guī)定了待校驗JSON數(shù)組所有元素應(yīng)該滿足的校驗邏輯。additionalItems已經(jīng)沒有用武之地了。
如果一個additionalItems的值如下:
{
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
}
],
"additionalItems": {
"type": "string",
"minLength": 2
}
}
上面的JSON Schema的意思是,待校驗JSON數(shù)組第一個元素是string類型,且可接受的最短長度為5個字符,第二個元素是number類型,且可接受的最小值為10,剩余的其他元素是string類型,且可接受的最短長度為2。那么,下面三個JSON數(shù)組是能夠通過校驗的,具體內(nèi)容如下:
["green", 10, "good"]["green", 11]["green", 10, "good", "ok"]
下面JSON數(shù)組是無法通過校驗的,具體內(nèi)容如下:
["green", 10, "a"]["green", 10, "ok", 2]
minItems、maxItems
這兩個關(guān)鍵字的值都是非負(fù)整數(shù)。 指定了待校驗JSON數(shù)組中元素的個數(shù)限制,minItems指定了待校驗JSON數(shù)組可以接受的最少元素個數(shù),而maxItems指定了待校驗JSON數(shù)組可以接受的最多元素個數(shù)。
另外,需要注意的是,省略minItems關(guān)鍵字和該關(guān)鍵字的值為0,具有相同效果。而,如果省略maxItems關(guān)鍵字則表示對元素的最大個數(shù)沒有限制。
例如,如果限制一個JSON數(shù)組的元素的最大個數(shù)為5,最小個數(shù)為1,則JSON Schema如下:
"minItems": 1,"maxItems": 5
uniqueItems
該關(guān)鍵字的值是一個布爾值,即boolean(true、false)。
當(dāng)該關(guān)鍵字的值為true時,只有待校驗JSON數(shù)組中的所有元素都具有唯一性時,才能通過校驗。當(dāng)該關(guān)鍵字的值為false時,任何待校驗JSON數(shù)組都能通過校驗。 另外,需要注意的是,省略該關(guān)鍵字和該關(guān)鍵字的值為false時,具有相同的效果。例如:
"uniqueItems": true
當(dāng)type的值為integer或者number時
integer和number的區(qū)別,integer相當(dāng)于python中的int類型,而number相當(dāng)于python中的int或float類型
multipleOf
該關(guān)鍵字的值是一個大于0的number,即可以是大于0的int,也可以是大于0的float。只有待校驗的值能夠被該關(guān)鍵字的值整除,才算通過校驗。
如果含有該關(guān)鍵字的JSON Schema如下:
{
"type": "integer",
"multipleOf": 2
}
那么,2、4、6都是可以通過校驗的,但是,3、5、7都是無法通過校驗的,當(dāng)然了,2.0、4.0也是無法通過校驗的,但是,并不是因為multipleOf關(guān)鍵字,而是因為type關(guān)鍵字。
如果含有multipleOf關(guān)鍵字的JSON Schema如下:
{
"type": "number",
"multipleOf": 2
}
那么,2、2.0、4、4.0都是可以通過校驗的,但是,3、3.0、3、3.0都是無法通過校驗的。
maximum 、exclusiveMaximum
maximum
該關(guān)鍵字的值是一個number,即可以是int,也可以是float。該關(guān)鍵字規(guī)定了待校驗元素可以通過校驗的最大值。即傳入的值必須小于maximum。exclusiveMaximum
該關(guān)鍵字和maximum
一樣,規(guī)定了待校驗元素可以通過校驗的最大值,不同的是待校驗元素可以等于exclusiveMaximum指定的值。即比maximum多了一個他自身這個邊界值.
{
"type": "number",# 設(shè)定 maximum 為12.3 則傳入值必須小于12.3#
"maximum": 12.3,# 設(shè)定 exclusiveMaximum為12.3 則傳入值是小于等于12.3
"exclusiveMaximum": 12.3
}
minimum、exclusiveMinimum
minimum
、exclusiveMinimum
關(guān)鍵字的用法和含義與maximum
、exclusiveMaximum
相似。唯一的區(qū)別在于,一個約束了待校驗元素的最小值,一個約束了待校驗元素的最大值。
當(dāng)type取值為string時
maxLength
該關(guān)鍵字的值是一個非負(fù)整數(shù)。該關(guān)鍵字規(guī)定了待校驗JSON元素可以通過校驗的最大長度,即待校驗JSON元素的最大長度必須小于或者等于該關(guān)鍵字的值。
minLength
該關(guān)鍵字的值是一個非負(fù)整數(shù)。該關(guān)鍵字規(guī)定了待校驗JSON元素可以通過校驗的最小長度,即待校驗JSON元素的最小長度必須大于或者等于該關(guān)鍵字的值。
pattern
該關(guān)鍵字的值是一個正則表達(dá)式。只有待校驗JSON元素符合該關(guān)鍵字指定的正則表達(dá)式,才算通過校驗。
format
該關(guān)鍵字的值可以是以下取值:
date
、date-time
(時間格式)、hostname
(網(wǎng)站地址格式)、ipv4
、ipv6
、uri
等等。
{
"type": "string",
"format": "email"
}
使用format關(guān)鍵字時,在實例化validator時必須給它傳format_checker
參數(shù),fromat_checker參數(shù)的值即使各種版本的JSON模式規(guī)范的驗證器類,如:
Draft7Validator Draft6Validator Draft4Validator
當(dāng)你實例化validator時,如果沒有給它傳format_checker參數(shù), jsonschema是不會自動校驗schema中的format關(guān)鍵字的.因此,你需要做以下步驟: 1.額外導(dǎo)入JSON Schema某個版本的模式規(guī)范如:from jsonschema import draft7_format_checker 2.實例化validator時傳入:validate(instance=json_data, schema=my_schema, format_checker=draft7_format_checker)
全類型可用
enum
該關(guān)鍵字的值是一個數(shù)組,該數(shù)組至少要有一個元素,且數(shù)組內(nèi)的每一個元素都是唯一的。 如果待校驗的JSON元素和數(shù)組中的某一個元素相同,則通過校驗。否則,無法通過校驗。
**注意:**該數(shù)組中的元素值可以是任何值,包括null。省略該關(guān)鍵字則表示無須對待校驗元素進行該項校驗。例如:
{
"type": "number",
"enum": [
2,
3,
null,
"hello"
]
}
const
該關(guān)鍵字的值可以是任何值,包括null。如果待校驗的JSON元素的值和該關(guān)鍵字指定的值相同,則通過校驗。否則,無法通過校驗。
allOf
該關(guān)鍵字的值是一個非空數(shù)組,數(shù)組里面的每個元素都必須是一個有效的JSON Schema。 只有待校驗JSON元素通過數(shù)組中所有的JSON Schema校驗,才算真正通過校驗。
anyOf
該關(guān)鍵字的值是一個非空數(shù)組,數(shù)組里面的每個元素都必須是一個有效的JSON Schema。 如果待校驗JSON元素能夠通過數(shù)組中的任何一個~~~~JSON Schema校驗,就算通過校驗。
oneOf
該關(guān)鍵字的值是一個非空數(shù)組,數(shù)組里面的每個元素都必須是一個有效的JSON Schema。 如果待校驗JSON元素能且只能通過數(shù)組中的某一個JSON Schema校驗,才算真正通過校驗。不能通過任何一個校驗和能通過兩個及以上的校驗,都不算真正通過校驗。
not
該關(guān)鍵字的值是一個JSON Schema。只有待校驗JSON元素不能通過該關(guān)鍵字指定的JSON Schema校驗的時候,待校驗元素才算通過校驗。
default
該關(guān)鍵字的值是沒有任何要求的。該關(guān)鍵字常常用來指定待校驗JSON元素的默認(rèn)值,當(dāng)然,這個默認(rèn)值最好是符合要求的,即能夠通過相應(yīng)的JSON Schema的校驗。 另外,需要注意的是,該關(guān)鍵字除了提示作用外,并不會產(chǎn)生任何實質(zhì)性的影響。
type關(guān)鍵字
需要特別注意的是,type關(guān)鍵字的值可以是一個string,也可以是一個數(shù)組。 如果type的值是一個string,則其值只能是以下幾種:null、boolean、object、array、number、string、integer。 如果type的值是一個數(shù)組,則數(shù)組中的元素都必須是string,且其取值依舊被限定為以上幾種。只要帶校驗JSON元素是其中的一種,則通過校驗。
**注意,**以上JSON Schema只是為了展示部分關(guān)鍵字的用法,可能和實際應(yīng)用略有不同。
dependencies關(guān)鍵字
依賴關(guān)系
{ "$schema": "http://json-schema.org/draft-07/schema#", "properties": { }, "dependencies": { "age": [ "name" ] }, }
上述schema表示,age依賴于name,如果age出現(xiàn),name必須出現(xiàn)
$ref關(guān)鍵字
使用該關(guān)鍵字可以引用一個規(guī)范
"warehouseLocation": {
"description": "Coordinates of the warehouse where the product is located.",
"$ref": "https://example.com/geographical-location.schema.json"
}
if-then-else 關(guān)鍵字
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"foo": {
"type": "string"
},
"bar": {
"type": "string"
}
},
"if": {
"properties": {
"foo": {
"enum": [
"bar",
"123"
]
}
},
"required": [
"foo"
]
},
"then": {
"required": [
"bar"
]
},
"else": {
"required": [
"cc"
]
}
}
符合上述規(guī)則的json(最簡單的兩種方式):
{ "foo": "bar22", "cc": 123}{ "foo": "bar", "bar": "123"}
概述:
if條件為:key為foo的值是bar或者123 返回true,否則返回falseif返回true執(zhí)行then: then的規(guī)則,bar必須存在if返回false執(zhí)行else else規(guī)則,cc必須存在
官方的參考文檔如下: json-schema.org/latest/json… json-schema.org/implementat…