python庫JsonSchema驗證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解_第1頁
python庫JsonSchema驗證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解_第2頁
python庫JsonSchema驗證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解_第3頁
python庫JsonSchema驗證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解_第4頁
python庫JsonSchema驗證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第python庫JsonSchema驗證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解目錄簡單實例type關(guān)鍵字object關(guān)鍵字屬性properties必需屬性大小數(shù)組屬性itemsListvalidationTuplevalidation長度唯一性通用關(guān)鍵字元數(shù)據(jù)枚舉值組合模式anyOfoneOfallOf$schema關(guān)鍵字正則表達(dá)式構(gòu)建復(fù)雜的模式重用JSONSchema是一個用于驗證JSON數(shù)據(jù)結(jié)構(gòu)的強大工具,我查看并學(xué)習(xí)了JSONSchema的官方文檔,做了詳細(xì)的記錄,分享一下。

我們可以使用JSONSchema在后續(xù)做接口測試中做詳細(xì)的數(shù)據(jù)值的校驗,數(shù)據(jù)類型校驗,json數(shù)據(jù)結(jié)構(gòu)的校驗。

jsonschema用以標(biāo)注和驗證JSON文檔的元數(shù)據(jù)的文檔

官方文檔地址jsonschema

簡單實例

有一個簡單的json數(shù)據(jù),根據(jù)json數(shù)據(jù)格式編寫jsonschema,然后校驗json數(shù)據(jù)每個字段是否是規(guī)定類型。

importjsonschema

json_data=[

'pm10':24,

'city':'珠海',

'time':'2016-10-2313:00:00'

'pm10':24,

'city':'深圳',

'time':'2016-10-2113:00:00'

'pm10':'21',

'city':'廣州',

'time':'2016-10-2313:00:00'

json_schema={

'type':'array',

'items':{

'type':'object',

'properties':{

'pm10':{

'type':'number',

'city':{

'type':'string',

'enum':['珠海','深圳']

'time':{

'type':'string'

jsonschema.validate(json_data,json_schema)

exceptjsonschema.ValidationErrorasex:

msg=ex

print(ex)

type關(guān)鍵字

type關(guān)鍵字是json模式的基礎(chǔ),指定架構(gòu)的數(shù)據(jù)類型。JSONSchema的核心定義了以下基本類型:

stringNumerictypesobjectarraybooleannull

這些類型在Python中對應(yīng)的類型如下,下表將JavaScript類型的名稱映射到Python的相關(guān)類型:

JavaScriptPythonstringstringnumberint/floatobjectdictarraylistbooleanboolnullnone

type關(guān)鍵字可以是一個字符串或數(shù)組:

如果它是一個字符串,那么它是上面一個基本能類型的名稱如果它是一個數(shù)組,它必須是一個字符串?dāng)?shù)組,其中每個字符串是其中一個基本類型的名稱,每個元素都是唯一的。在這種情況下,如果json代碼段與任何給定類型匹配,則改代碼段有效。

以下做個type關(guān)鍵字的簡單示例:

{type:number}

定義某個字段類型是number,如果是40,43.0這樣是校驗通過的如果是43,包含數(shù)字的字符串這樣是無法校驗通過的.

{type:[number,string]}

定義某個字段類型是number或string中一種如果是43,或者我和你這樣是校驗通過的如果是[43,我和你],這樣是不通過的,因為不接受結(jié)構(gòu)化數(shù)據(jù)類型。

object關(guān)鍵字

在Python中,對象對應(yīng)的類型是dict類型。

屬性properties

使用properties關(guān)鍵字定義對象上的屬性(鍵值對)。例如,我們要為由數(shù)字,街道名稱和街道類型組成的地址定義一個簡單的模式

{

“type”:“object”,

“properties”:{

“number”:{“type”:“number”},

“street_name”:{“type”:“string”},

“street_type”:{

“type”:“string”,

“enum”:[“Street”,“Avenue”,“Boulevard”]

}

必需屬性

默認(rèn)情況下,properties不需要由關(guān)鍵字定義的屬性。但是,可以使用required關(guān)鍵字提供所需屬性的列表。

required關(guān)鍵字接受一個或多個字符串的數(shù)組。每個字符串必須是唯一的。

在以下定義用戶記錄的示例模式中,我們要求每個用戶都有一個名稱和電子郵件地址,但我們不介意他們是否提供了他們的地址或電話號碼:

{

“type”:“object”,

“properties”:{

“name”:{“type”:“string”},

“email”:{“type”:“string”},

“address”:{“type”:“string”},

“telephone”:{“type”:“string”}

“required”:[“name”,“email”]

}

大小

可以使用minProperties和maxProperties關(guān)鍵字限制對象上的屬性數(shù)。這些中的每一個都必須是非負(fù)整數(shù)。

{

“type”:“object”,

“minProperties”:2,

“maxProperties”:3

}

數(shù)組屬性

數(shù)組用于有序元素。

在Python中,array類似于list或tuple類型,具體取決于用法。

例如:[1,2,3,4,5]

[2,dd]

items

數(shù)組的元素可能是任何東西,但是,根據(jù)某些模式驗證數(shù)組的項通常很有用。這里使用items和additionalItems關(guān)鍵字完成。

在JSON中,通常使用兩種方式的數(shù)據(jù)

列表驗證:任意長度的序列,其中每個元素匹配相同的模式元組驗證:一個固定長度的序列,其中每個項目可能具有不同的模式,在此用法中,每個項目的索引(位置)對于如何解釋值是有意義的,例如Python的tuple。

Listvalidation

列表驗證對于任意長度的數(shù)組非常有用,其中每個項都匹配相同的模式,對于此類數(shù)組,將items關(guān)鍵字設(shè)置為單個模式,用該模式來驗證數(shù)組中的所有項。

注意:這時items是單個模式,additionalItems關(guān)鍵字沒有意義,不應(yīng)該使用它。

例如下面的事例中我們定義數(shù)組中每個項都是一個數(shù)字

{

“type”:“array”,

"items":{

"type":"number"

}

如果是[1,2,3,4,5],pass

如果是[1,2,3,5,6],false

如果是[],pass

Tuplevalidation

當(dāng)數(shù)組是項目集合時,就需要元組驗證。其中每個項目都有不同的模式,并且每個項目的序數(shù)索引是有意義的。

例如:街道地址這樣表示

1600PennsylvaniaAvenueNW就有4中type[number,streent_name,street_type,direction]

每個字段都有不同的架構(gòu)

number:地址編號,必須是數(shù)字street_name:街道的名稱,必須是字符串street_type:街道的類型,應(yīng)該是一組固定值的字符串direction:地址的位置,應(yīng)該是來自不同值集的字符串

為此我們將items關(guān)鍵字設(shè)置成一個數(shù)組,其中每個項目都是一個與文檔數(shù)組的每個索引相對應(yīng)的模式,也就是一個數(shù)組,第一個元素模式驗證輸入數(shù)組的第一個元素.第二個元素模式驗證輸入數(shù)組的第二個元素,等等

示例:

{

“type”:“array”,

“items”:[

“type”:“number”

“type”:“string”

“type”:“string”,

“enum”:[“Street”“,”Avenue“,”Boulevard“]

”type“:”string“,

”enum“:[”NW“,”NE“,“SW”,“SE”]

}

如果是[1600,賓夕法尼亞,Street,NW],pass如果是[10,等等,等等],false并且在默認(rèn)情況下,添加其他項目也可以:[1600,賓夕法尼亞州,Street,NW,華盛頓]

additionalItems關(guān)鍵字控制是否有效有超出了在架構(gòu)中定義的數(shù)組的其他項目,如果設(shè)置為false,則會不允許數(shù)組中的額外項。

長度

可以使用minItems和maxItems關(guān)鍵字指定數(shù)組的長度。每個關(guān)鍵字的值必須是非負(fù)數(shù)。無論是進(jìn)行List驗證還是Tuple驗證,這些關(guān)鍵字都有效。示例:

{

“type”:“array”,

“minItems”:2,

“maxItems”:3

}

唯一性

使用uniqueItems關(guān)鍵字設(shè)置為true,則數(shù)組中的每個項都是唯一的。

通用關(guān)鍵字

元數(shù)據(jù)

json模式包含幾個關(guān)鍵字,title,description和default,不嚴(yán)格用來校驗格式,但用來描述模式的一部分。在title和description管家你必須是字符串

枚舉值

enum關(guān)鍵字用于限制值,以一個固定的一組值,它必須是一個必須包含一個元素的數(shù)組,其中每個元素都是唯一的。

{type:string,enum:[red,green]}

如果檢驗字段的值在枚舉中是通過的,如果不是無法校驗通過。

組合模式

JSONSchema包含一些用于將模式組合在一起的關(guān)鍵字,這并不意味著組合來自多個文件或JSON樹的模式,盡管這些工具有助于實現(xiàn)這一點,并在結(jié)構(gòu)化復(fù)雜模式中進(jìn)行了描述。

例如,在以下的模式,anyOf關(guān)鍵字用于表示給定值可能對任何給定的子模式有效。第一個子模式需要一個最大長度為5的字符串。第二個子模式需要一個最小值為0的數(shù)字。只要一個值對這些模式中的任何一個進(jìn)行驗證,它就被認(rèn)為整個組合模式有效。

{anyOf:[{type:string,maxLength:5},{type:string,minimum:0}]}

用于組合模式的關(guān)鍵字是:

allOf:必須對所有子模式有效anyOf:必須對任何子模式有效(一個或多個)oneOf:必須僅對其中一個子模式有效

anyOf

要進(jìn)行驗證anyOf,給定數(shù)據(jù)必須對任何(一個或多個)給定子模式有效。

{

“anyOf”:[

{“type”:“string”},

{“type”:“number”}

}

如果是您好,pass如果是33,pass如果是[ddd,33],false

oneOf

要進(jìn)行驗證oneOf,給定數(shù)據(jù)必須僅對其中一個給定子模式有效。

{

“oneOf”:[

{“type”:“number”,“multipleOf”:5},

{“type”:“number”,“multipleOf”:3}

}

如果是5的倍數(shù),pass如果是3的倍數(shù),pass如果是5和3的倍數(shù),false

allOf

要進(jìn)行驗證allOf,給定數(shù)據(jù)必須對所有給定的子模式有效。

{

“allOf”:[

{“type”:“string”},

{“maxLength”:5}

}

$schema關(guān)鍵字

該$schema關(guān)鍵字用于聲明JSON片段實際上是JSON模式的一部分。它還聲明了針對該模式編寫的JSONSchema標(biāo)準(zhǔn)的哪個版本。

建議所有JSON模式都有一個$schema條目,該條目必須位于根目錄下。因此,大多數(shù)情況下,您需要在架構(gòu)的根目錄下:

$schema:/schema#

正則表達(dá)式

該模式和模式屬性關(guān)鍵字使用正則表達(dá)式來表示約束。使用的正則表達(dá)式語法來自JavaScript(具體為ECMA262)。但是,并未廣泛支持該完整語法,因此建議您堅持使用下述語法的子集。

單個unicode字符(下面的特殊字符除外)與自身匹配。^:僅匹配字符串的開頭。$:僅匹配字符串的末尾。():將一系列正則表達(dá)式分組到單個正則表達(dá)式中。|:匹配|符號前面或后面的正則表達(dá)式。[abc]:匹配方括號內(nèi)的任何字符。[a-z]:匹配字符范圍。[^abc]:匹配未列出的任何字符。[^a-z]:匹配范圍之外的任何字符。+:匹配前一個正則表達(dá)式的一個或多個重復(fù)。*:匹配前面正則表達(dá)式的零次或多次重復(fù)。:匹配前一個正則表達(dá)式的零次或一次重復(fù)。+,,:的,+和預(yù)選賽都是貪婪的;它們匹配盡可能多的文本。有時這種行為是不可取的,您希望匹配盡可能少的字符。{x}:完全x匹配前面正則表達(dá)式的出現(xiàn)次數(shù)。{x,y}:匹配前面正則表達(dá)式的至少x和最y多次出現(xiàn)。{x,}:匹配x前面正則表達(dá)式的出現(xiàn)次數(shù)或更多。{x},{x,y},{x,}:上述表達(dá)式的惰性版本。

示例:

{

“type”:“string”,

“pattern”:“^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$“

}

如果是555-1212,pass如果是(888)555-1212,pass如果是(888)555-1212分機532,false

構(gòu)建復(fù)雜的模式

重用

有些模式可能是在幾個地方都是通用的,如果每次都重寫會使模式更加冗長,以后更新也會很復(fù)雜,我們可以用重用的方式來做。例如:定義客戶記錄,每個客戶都有可能同時擁有送貨地址和賬單地址,地址總是相同的,有街道地址,城市,州名。

定義地址模式:

{

“type”:“object”,

“properties”:{

“street_address”:{“type”:“string”},

“city”:{“type”:“string”},

“state”:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論