欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python庫(kù)JsonSchema驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解

 更新時(shí)間:2022年05月13日 11:08:51   作者:不當(dāng)咸魚(yú)  
這篇文章主要為大家介紹了python庫(kù)JsonSchema驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

JSON Schema是一個(gè)用于驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)的強(qiáng)大工具, 我查看并學(xué)習(xí)了JSON Schema的官方文檔, 做了詳細(xì)的記錄, 分享一下。

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

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

官方文檔地址jsonschema

簡(jiǎn)單實(shí)例

有一個(gè)簡(jiǎn)單的json數(shù)據(jù), 根據(jù)json數(shù)據(jù)格式編寫(xiě)jsonschema, 然后校驗(yàn)json數(shù)據(jù)每個(gè)字段是否是規(guī)定類(lèi)型。

import jsonschema
json_data = [
{
  'pm10': 24,
  'city': '珠海',
  'time': '2016-10-23 13:00:00'
},
{
  'pm10': 24,
  'city': '深圳',
  'time': '2016-10-21 13:00:00'
},
{
  'pm10': '21',
  'city': '廣州',
  'time': '2016-10-23 13:00:00'
}
]
json_schema = {
  'type': 'array',
  'items': {
    'type': 'object',
    'properties': {
      'pm10': {
        'type': 'number',
      },
      'city': {
        'type': 'string',
        'enum': ['珠海', '深圳']
      },
      'time': {
        'type': 'string'
      }
    }
  }
}
try:
  jsonschema.validate(json_data, json_schema)
except jsonschema.ValidationError as ex:
  msg = ex
  print(ex)

type關(guān)鍵字

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

  • string
  • Numeric types
  • object
  • array
  • boolean
  • null

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

JavaScriptPython
stringstring
numberint/float
objectdict
arraylist
booleanbool
nullnone

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

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

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

{“type”: “number”}

定義某個(gè)字段類(lèi)型是number, 如果是 40, 43.0這樣是校驗(yàn)通過(guò)的如果是”43”, 包含數(shù)字的字符串這樣是無(wú)法校驗(yàn)通過(guò)的.

{“type”: [“number”, ‘string’]}

定義某個(gè)字段類(lèi)型是number或string中一種如果是43, 或者 “我和你” 這樣是校驗(yàn)通過(guò)的如果是[43, “我和你”], 這樣是不通過(guò)的, 因?yàn)椴唤邮芙Y(jié)構(gòu)化數(shù)據(jù)類(lèi)型。

object關(guān)鍵字

在Python中, 對(duì)象對(duì)應(yīng)的類(lèi)型是dict類(lèi)型。

屬性 properties

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

{
  “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)鍵字接受一個(gè)或多個(gè)字符串的數(shù)組。每個(gè)字符串必須是唯一的。

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

{
  “type” : “object” ,
  “properties” : {
    “name” : { “type” : “string” },
    “email” : { “type” : “string” },
    “address” : { “type” : “string” },
    “telephone” : { “type” : “string” }
  },
  “required” : [ “name” , “email”]
}

大小

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

{
  “type” : “object” ,
  “minProperties” : 2 ,
  “maxProperties” : 3
}

數(shù)組屬性

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

在Python中, array類(lèi)似于 list或tuple類(lèi)型,具體取決于用法。

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

[2, ‘dd’]

items

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

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

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

List validation

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

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

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

{
  “type” : “array” ,
  "items": {
    "type": "number"
  }
}

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

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

如果是[], pass

Tuple validation

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

例如: 街道地址這樣表示

1600 Pennsylvania Avenue NW就有4中type[number, streent_name, street_type, direction]

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

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

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

示例:

{
  “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)情況下, 添加其他項(xiàng)目也可以:[ 1600 , “賓夕法尼亞州” , “Street” , “NW” , “華盛頓” ]

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

長(zhǎng)度

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

{
  “type” : “array” ,
  “minItems” : 2 ,
  “maxItems” : 3
}

唯一性

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

通用關(guān)鍵字

元數(shù)據(jù)

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

枚舉值

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

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

如果檢驗(yàn)字段的值在枚舉中是通過(guò)的, 如果不是無(wú)法校驗(yàn)通過(guò)。

組合模式

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

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

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

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

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

anyOf

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

{
  “anyOf” : [
    { “type” : “string” },
    { “type” : “number” }
  ]
}

如果是 “您好”, pass如果是 33, pass如果是 [‘ddd’, 33], false

oneOf

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

{
  “oneOf” : [
    { “type” : “number” , “multipleOf” : 5 },
    { “type” : “number” , “multipleOf” : 3 }
  ]  
}

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

allOf

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

{
  “allOf” : [
    { “type” : “string” },
    { “maxLength” : 5 }
  ]
}

$schema關(guān)鍵字

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

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

“$ schema” : “http://json-schema.org/schema#”

正則表達(dá)式

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

  • 單個(gè)unicode字符(下面的特殊字符除外)與自身匹配。
  • ^:僅匹配字符串的開(kāi)頭。
  • $:僅匹配字符串的末尾。
  • (…):將一系列正則表達(dá)式分組到單個(gè)正則表達(dá)式中。
  • |:匹配|符號(hào)前面或后面的正則表達(dá)式。
  • [abc]:匹配方括號(hào)內(nèi)的任何字符。
  • [a-z]:匹配字符范圍。
  • [^abc]:匹配未列出的任何字符。
  • [^a-z]:匹配范圍之外的任何字符。
  • +:匹配前一個(gè)正則表達(dá)式的一個(gè)或多個(gè)重復(fù)。
  • *:匹配前面正則表達(dá)式的零次或多次重復(fù)。
  • ?:匹配前一個(gè)正則表達(dá)式的零次或一次重復(fù)。
  • +?,?,??:的,+和?預(yù)選賽都是貪婪的; 它們匹配盡可能多的文本。有時(shí)這種行為是不可取的,您希望匹配盡可能少的字符。
  • {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分機(jī)532” , false

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

重用

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

定義地址模式:

{
  “type” : “object” ,
  “properties” : {
    “street_address” : { “type” : “string” },
    “city” : { “type” : “string” },
    “state” : { “type” : “string” }
  },
  “required” : [ “street_address” , “city” ,“state” ]
}

我們重用上面的模式, 將其放在父模式下, 名為definitions:

{
  “definitions” : {
    “address” : {
      “type” : “object” ,
      “properties” : {
        “street_address” :{“type” :“string”},
        “city” : { “type” : “string” },
        “state” : { “type” : “string” }
      },
    “required” :[“street_address” ,“city”,“州”]
    }
  }
}

然后我們使用$ref關(guān)鍵字從其他地方引用此架構(gòu)片段, 指向此模塊的位置

{ “$ ref” : “#/ definitions / address” }

值 $ref 是一個(gè)名為 JSON Pointer的格式的字符串。

‘#’引用當(dāng)前文檔,‘/’遍歷文檔中對(duì)象中的鍵, 因此

“#/ definitions / address” 意味著:

  • 轉(zhuǎn)到文檔的根目錄
  • 找到秘鑰的值”definitions”
  • 在該對(duì)象中, 找到鍵的值”address”

$ref也可以是相對(duì)或絕對(duì)的URI, 例如:

{ “$ ref” : “definitions.json#/ address” }

以上就是python庫(kù)JsonSchema驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解的詳細(xì)內(nèi)容,更多關(guān)于JsonSchema驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論