JsonSchema基礎和語法詞典

啟動架構

聲明jsonschema:

schema?架構關鍵字,指出此架構是根據(jù)標準的特定草稿編寫的

id?架構關鍵字,定義模式的URI,并解析模式中其他URI引用的基URI

title?和?description?關鍵字是描述性的,并不對數(shù)據(jù)具有約束作用,只是用來對文檔作補充說明

type驗證關鍵字定義我們的JSON數(shù)據(jù)的第一個約束,在這種情況下,它必須是一個JSON對象

例子



type關鍵字指定對象或屬性的類型

常用類型:

string:字符串? ? ? ? ? ? number:數(shù)字? ? ? ?integer:整型? ? ? ?boolean:布爾值? ? ? ? ? ? object:對象? ? array:數(shù)組


string 字符串的驗證關鍵字

maxLength:此關鍵字的值必須是非負整數(shù)。如果字符串實例的長度小于或等于此關鍵字的值,則該字符串實例合法。

minLength:此關鍵字的值必須是非負整數(shù)。如果字符串實例的長度大于或等于此關鍵字的值,則該字符串實例合法。如果沒有此關鍵字,則默認字符串實例的長度>=0。

pattern:該值為正則表達式。如果字符串實例與此正則表達式匹配,則認為字符串實例有效。


array?數(shù)組的驗證關鍵字

items:array里每個元素的類型。如果items是一個object對象,則需要定義該對象下的每個元素校驗模板,如果實例中的所有元素都匹配這些模板,則認為實例合法有效。如果items是一個array數(shù)組,則只需要定義一個元素的校驗模板,所有實例中的所有元素都匹配這個模板,則認為實例合法有效。省略此關鍵字與空schema具有相同的效果。

maxItems:此關鍵字的值必須是非負整數(shù)。如果數(shù)組實例的元素個數(shù)小于或等于此關鍵字的值,則認為實例合法。

minItems:此關鍵字的值必須是非負整數(shù)。如果數(shù)組實例的大小大于或等于此關鍵字的值,則認為實例合法。如果沒有此關鍵字,則數(shù)組元素的個數(shù)必須>=0。

uniqueItems:該關鍵字的值必須是布爾值。如果此關鍵字為false,則實例里的各元素可以相同;如果它為true,則實例里的各元素要各不相同才算合法有效。如果沒有此關鍵字,則默認實例里的各元素可以相同。

contains:此關鍵字的值必須是有效的JSON格式。如果至少有一個元素對給定的模式有效,則數(shù)組實例對“contains”有效。

例子:只要包含數(shù)字即有效


additionalItems:其值必須是有效的json格式,針對實例多出來的數(shù)據(jù)進行校驗。如果值為false,則實例里只要有一個不匹配items,則無效。

例子:多出來的只要是字符串即有效


dependencies:屬性依賴,該關鍵字的值必須是一個對象。如果A依賴于B,則當存在A而沒有B時,實例算是不合法的。

例子:存在credit_card時必須要有billing_address ,但是存在billing_address 時不一定要存在credit_card



object?對象的驗證關鍵字

type:類型

properties:其值必須是一個對象,且該對象的每個值必須是有效的JSON格式。必須得有這個關鍵字,如果沒有則認為是空對象。

required:該關鍵字的值必須是一個數(shù)組。如果這個數(shù)組有元素的話,元素的類型必須是字符串,并且是唯一的。如果定義了這個關鍵字,那么表示實例中必須得有這個關鍵字里的元素,沒有的話,則實例不合法。如果沒有此關鍵字,則認為是空數(shù)組,則表明此對象下的元素都不是必須的。

maxProperties:此關鍵字的值必須是非負整數(shù)。如果對象實例的屬性數(shù)小于或等于此關鍵字的值,則認為實例合法有效。

minProperties:此關鍵字的值必須是非負整數(shù)。如果對象實例的屬性數(shù)大于或等于此關鍵字的值,則認為實例合法有效。如果沒有此關鍵字,則認為實例屬性個數(shù)>=0即可。

additionalProperties:其值必須是有效的JSON模式。此關鍵字確定子實例如何驗證對象,而不直接驗證直接實例本身。使用“additionalProperties”進行驗證僅適用于與“properties”中的任何名稱都不匹配的實例名稱的子值,并且不匹配“patternProperties”中的任何正則表達式。對于所有此類屬性,如果子實例針對“additionalProperties”架構進行驗證,則驗證成功。省略此關鍵字與空架構具有相同的行為。與additionalItems類似。如果值為false,則實例里只要有一個不匹配properties,則無效。

例子:與properties里不匹配的那個字段只要是字符串即有效


propertyNames:其值必須是有效的JSON格式,定義?properties的屬性名稱的格式。如果實例屬性的名稱不符合所定義的規(guī)則,則無效。

例子:properties的屬性名稱必須是字母或者下劃線開頭、中間是字母或者數(shù)字或者下劃線、以任意字母結尾才算合法有效


dependencies:屬性依賴,該關鍵字的值必須是一個對象。如果A依賴于B,則當存在A而沒有B時,實例算是不合法的。例子見數(shù)組模塊。

patternProperties:其值必須是一個對象,用正則表達式去定義?properties的屬性名稱的格式。如果實例屬性的名稱不符合所定義的規(guī)則,則無效。

例子



integer 整型的驗證關鍵字

minimum:該關鍵字的值必須是一個數(shù)字,表示數(shù)字實例的包含下限。當實例大于或等于此值時,該實例才合法。

maximum:該關鍵字的值必須是一個數(shù)字,表示數(shù)字實例的包含上限。當實例小于或等于此值時,該實例才合法。

exclusiveMinimum:如果存在此關鍵字并且為 true,則表明實例僅在其值嚴格大于(不等于)?"minimum" 的值時才算合法有效

exclusiveMaximum:如果存在此關鍵字并且為 true,則表明實例僅在其值嚴格小于(不等于)?"maximum" 的值時才算合法有效

multipleOf:其值必須是大于0的整數(shù),僅當實例被這個關鍵詞的值除以之后的結果是一個整數(shù)時,這個實例才是有效的。

enum:該關鍵字的值是數(shù)組,實際返回的字段值在這個數(shù)組里,才算有效


number 數(shù)字的驗證關鍵字

此關鍵字可以描述任意長度,任意小數(shù)點的數(shù)字。

minimum:該關鍵字的值必須是一個數(shù)字,表示數(shù)字實例的包含下限。當實例大于或等于此值時,該實例才合法。

maximum:該關鍵字的值必須是一個數(shù)字,表示數(shù)字實例的包含上限。當實例小于或等于此值時,該實例才合法。

exclusiveMinimum:如果存在此關鍵字并且為 true,則表明實例僅在其值嚴格大于(不等于)?"minimum" 的值時才算合法有效

exclusiveMaximum:如果存在此關鍵字并且為 true,則表明實例僅在其值嚴格小于(不等于)?"maximum" 的值時才算合法有效


其他關鍵字

boolean?:就兩種情況:true或者false

enum:其值必須是數(shù)組,列出所有情況,如果實例的值不在這個數(shù)組里,則實例無效

null:空

const:其值可以是任意類型,包括null,只要實例的返回值跟這個值一模一樣,則實例有效合法

具體可以參考文章1??參考文章2



架構外的引用

可在schema內部引用另外一個schema來合并驗證?

目的:重用,可讀性和可維護性?

warehouseLocation關鍵字和ref關鍵字?

例如:?

"warehouseLocation":?{?

??????"description":?"Coordinates of the warehouse where the product is located.",?

??????"$ref":?"https://example.com/geographical-location.schema.json"?

????}?

ref的值為被引用的schema的$id?



架構內的引用

可在schema內部引用另外一個schema來合并驗證?

definitions關鍵字和ref關鍵字?

例如:?

{

? ? ?"vegetables":?{?

??????"type":?"array",?

??????"items":?{?"$ref":?"#/definitions/veggie"?}?

????}?

??},?

??"definitions":?{?

????"veggie":?{?

??????"type":?"object",?

??????"required":?[?"veggieName",?"veggieLike"?],?

??????"properties":?{?

????????"veggieName":?{?

??????????"type":?"string",?

??????????"description":?"The name of the vegetable."?

????????},?

????????"veggieLike":?{?

??????????"type":?"boolean",?

??????????"description":?"Do I like this vegetable?"?

????????}?

使用條件應用于子模式的關鍵字

這些關鍵字一起工作以基于另一個子模式的結果實現(xiàn)子模式的條件應用。

if

此關鍵字的值必須是有效的JSON格式。

此關鍵字的子模式的驗證結果對整體驗證結果沒有直接影響。相反,它控制了哪個“then”或“else”關鍵字被判斷。

成功驗證此關鍵字的子模式的實例必須對“then”關鍵字的子模式值(如果存在)有效。

無法針對此關鍵字的子模式進行驗證的實例也必須對“else”關鍵字的子模式值(如果存在)有效。

then

此關鍵字的值必須是有效的JSON格式。

當“if”存在且實例成功驗證其子模式時,如果實例也成功驗證此關鍵字的子模式,則valiation將成功對該關鍵字進行驗證。

當“if”不存在時,或者實例無法針對其子模式進行驗證時,此關鍵字無效。

else

此關鍵字的值必須是有效的JSON格式。

當“if”存在且實例無法針對其子模式進行驗證時,如果實例成功驗證此關鍵字的子模式,則valiation將成功對該關鍵字進行驗證。

當“if”不存在時,或者實例成功驗證其子模式時,此關鍵字無效。



使用布爾邏輯應用子模式的關鍵字

allOf:該關鍵字的值必須是非空數(shù)組,數(shù)組的每個項必須是有效的JSON模式,意思是展示全部屬性。如果實例針對此關鍵字的值定義的所有模式成功驗證,則實例才算合法有效。

anyOf:該關鍵字的值必須是非空數(shù)組,數(shù)組的每個項必須是有效的JSON模式,意思是展示任意屬性。如果實例針對此關鍵字的值定義的至少一個模式成功驗證,則實例就算合法有效。

oneOf:該關鍵字的值必須是非空數(shù)組,數(shù)組的每個項必須是有效的JSON模式,意思是滿足其中一個屬性。如果實例針對此關鍵字的值定義的有且只有一個模式成功驗證,則實例就算合法有效。

not:此關鍵字的值必須是有效的JSON模式,非 * 類型。如果實例無法針對此關鍵字定義的模式成功驗證,則實例就算合法有效。

例如:實例不是字符串則算合法有效

具體使用參考:https://blog.csdn.net/weixin_42534940/article/details/103615260


備注

1、https://jsonschema.net/previous? ? ? 這個網(wǎng)站可以生成基礎的schema校驗模板,但是有可能是有錯的,得自己再檢查并補充修改

2、填寫正則表達式之后最好再檢查一下數(shù)據(jù)的json格式是否正確,因為部分正則表達式可能因為部分字符讓json格式校驗不通過

例如:驗證任意數(shù)字,如果直接像左邊這樣寫就是錯的json格式;加個轉義符號就校驗通過
這是驗證應用包名的正則,也是需要轉義符號


3、type也可以寫成數(shù)組類型

可以匹配 "a": 或者 "a": null 的情況
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容