版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來五年羊毛企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年城市鮮花布置服務(wù)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年清茶企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 熱力系統(tǒng)安全評估方案
- 施工現(xiàn)場安全生產(chǎn)會議制度方案
- 工地物料清單管理系統(tǒng)方案
- 公關(guān)活動策劃方案及執(zhí)行步驟
- 高校學(xué)生心理咨詢案例及輔導(dǎo)方案
- 2026年初中散文閱讀理解技巧試題及答案
- 玩具手繪設(shè)計技能考核試卷及答案
- 綠化設(shè)備安全培訓(xùn)課件
- 給水管道遷改工程施工方案
- 【數(shù)學(xué)】二次根式及其性質(zhì)第1課時二次根式的概念課件 2025~2026學(xué)年人教版數(shù)學(xué)八年級下冊
- 非連續(xù)性文本閱讀(中考試題20篇)-2024年中考語文重難點復(fù)習(xí)攻略(解析版)
- 畜禽糞污資源化利用培訓(xùn)
- 《搶救藥物知識》課件
- 建筑工程咨詢服務(wù)合同(標(biāo)準(zhǔn)版)
- 2024年4月自考05424現(xiàn)代設(shè)計史試題
- 綜合能源管理系統(tǒng)平臺方案設(shè)計及實施合集
- 甲苯磺酸奧馬環(huán)素片-藥品臨床應(yīng)用解讀
- 共享單車對城市交通的影響研究
評論
0/150
提交評論