json之JsonSchema教程

json之JsonSchema教程

簡介

JSON Schema是基於JSON格式,用於定義JSON數據結構以及校驗JSON數據內容。 JSON Schema官網地址:json-schema.org/html

我的觀點:JsonSchema相似於xml的schema和DTD的做用,主要是用來規範json的格式。python

關鍵字及其描述

關鍵字 描述
$schema 表示該JSON Schema文件遵循的規範
title 爲該JSON Schema文件提供一個標題
description 關於該JSON Schema文件的描述信息
type 表示待校驗元素的類型(例如,最外層的type表示待校驗的是一個JSON對象,內層type分別表示待校驗的元素類型爲,整數,字符串,數字)
properties 定義待校驗的JSON對象中,各個key-value對中value的限制條件
requiredv 定義待校驗的JSON對象中,必須存在的key
minimum 用於約束取值範圍,表示取值範圍應該大於或等於minimum
exclusiveMinimum 若是minimum和exclusiveMinimum同時存在,且exclusiveMinimum的值爲true,則表示取值範圍只能大於minimum
maximum 用於約束取值範圍,表示取值範圍應該小於或等於maximum
exclusiveMaximum 若是maximum和exclusiveMaximum同時存在,且exclusiveMaximum的值爲true,則表示取值範圍只能小於maximum
multipleOf 用於約束取值,表示取值必須可以被multipleOf所指定的值整除
maxLength 字符串類型數據的最大長度
minLength 字符串類型數據的最小長度
pattern 使用正則表達式約束字符串類型數據

JSON Schema關鍵字詳解

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"
    ]
}
複製代碼

詳細解釋:正則表達式

  • $schema:用於指定JSONSchema的版本信息,該值由官方提供,不可亂寫。該關鍵字能夠省略。
  • title:當前schema的標題信息。能夠省略
  • description:當前節點的描述
  • type:當前節點的類型,最外層type表明json的最外層是什麼樣的類型。例如上方的例子中,符合該JsonSchema的json數據必需是一個JsonObject而不能是一個JsonArray
  • properties:表明當前節點的子節點信息。例如上方的例子中,符合該JsonSchema的json數據的信息能夠存在「name」節點和「age」節點。按照上面的配置required信息來看,name是必須要有的,而age是非必需的。
  • required: 是一個數組類型,表明當前節點下必需的節點key。例如上方例子中,規定了json的格式必須要有name節點。

符合上述JsonSchema的json數據以下:編程

第一種(不含有age節點,只含有name一個節點或者name及其若干個節點):json

{
  "name": "shaofeer"
}

複製代碼

第二種(含有age節點,age節點的值必需爲integer類型):數組

{
  "name": "shaofeer",
  "age": 123,
  "create_time": "2019-12-12"
}
複製代碼

type的經常使用取值

type取值 對應的python數據類型
object Object
array List
integer int
number float或int
null None
boolean Boolean
string String

關鍵字詳解

最外層type爲object時

  • properties

該關鍵字的值是一個對象。bash

用於指定JSON對象中的各類不一樣key應該知足的校驗邏輯,若是待校驗JSON對象中全部值都可以經過該關鍵字值中定義的對應key的校驗邏輯, 每一個key對應的值,都是一個JSON Schema,則待校驗JSON對象經過校驗。 從這裏,咱們能夠看到,只要待校驗JSON對象的全部key分別都經過對應的JSON Schema的校驗檢測,這個對象纔算是經過校驗。數據結構

"properties": {
    "name": {
      "description": "姓名必須由2-3個字組成",
      "type": "string",
      "maxLength": 3,
      "minLength": 2
    },
    "age": {
      "description": "年齡必須大於18歲。而且不能超過60歲",
      "type": "integer",
      "minimum": 18,
      "maximum": 60
    }
  }

複製代碼

解釋:**每一個key對應的值,都是一個JSON Schema:**例如上方例子中,每個key(name/age)對應的值都是一個JSONSchema,JSONSchema中的關鍵字及描述均可以使用。學習

  • required

該關鍵字的值是一個數組,而數組中的元素必須是字符串,並且必須是惟一的。

該關鍵字限制了JSON對象中必須包含哪些一級key。 若是一個JSON對象中含有required關鍵字所指定的全部一級key,則該JSON對象可以經過校驗。

"required": ["id","name","price"]
複製代碼
  • minProperties、maxProperties

這兩個關鍵字的值都是非負整數。規定最多節點個數與最少節點個數。

指定了待校驗JSON對象中一級key的個數限制,minProperties指定了待校驗JSON對象能夠接受的最少一級key的個數,而maxProperties指定了待校驗JSON對象能夠接受的最多一級key的個數。

另外,須要注意的是,省略minProperties關鍵字和該關鍵字的值爲0,具備相同效果。而,若是省略maxProperties關鍵字則表示對一級key的最大個數沒有限制。例如,若是限制一個JSON對象的一級key的最大個數爲5,最小個數爲1,則JSON Schema以下:

"minProperties": 1,
"maxProperties": 5
複製代碼
  • patternProperties

該關鍵字的值是一個對象,該JSON對象的每個一級key都是一個正則表達式,value都是一個JSON Schema。 指定符合正則表達式的key的規則。 只有待校驗JSON對象中的一級key,經過與之匹配的patternProperties中的一級正則表達式, 對應的JSON Schema的校驗,纔算經過校驗。例如,若是patternProperties對應的值以下

"patternProperties": {
        "^a": {
            "type": "number"
        },
        "^b": {
            "type": "string"
        }
}
複製代碼

上面的JSON Schema表示,待校驗JSON對象中,全部以a開頭的一級key的value都必須是number,全部以b開頭的一級key的value都必須是string。

  • additionalProperties

該關鍵字的值是一個JSON Schema。

若是待校驗JSON對象中存在,既沒有在properties中被定義,又沒有在patternProperties中被定義,那麼這些一級key必須經過additionalProperties的校驗。

最外層type爲array時

  • items:

該關鍵字的值是一個有效的JSON Schema或者一組有效的JSON Schema。

當該關鍵字的值是一個有效的JSON Schema時,只有待校驗JSON數組中的全部元素均經過校驗,整個數組纔算經過校驗。例如,若是items關鍵字的具體定義以下:

{
   "type": "array",
   "items": {
     "type": "string",
     "minLength": 5 
   }
}
複製代碼

上面的JSON Schema的意思是,待校驗JSON數組的元素都是string類型,且最小可接受長度是5。那麼下面這個JSON數組明顯是符合要求的,具體內容以下:

["myhome", "green"]
複製代碼

那麼下面這個JSON數據則是不符合要求,由於第一個元素的長度小於5,具體內容以下:

["home", "green"]
複製代碼

以上對於items的介紹是對於全部元素來規定的。

注意 下面對items的詳解,趨向於每個元素的規則。

這裏須要注意的是,若是items定義的有效的JSON Schema的數量和待校驗JSON數組中元素的數量不一致,那麼就要採用**「取小原則」**。即,若是items定義了3個JSON Schema,可是待校驗JSON數組只有2個元素,這時,只要待校驗JSON數組的前兩個元素可以分別經過items中的前兩個JSON Schema的校驗,那麼,咱們認爲待校驗JSON數組經過了校驗。而,若是待校驗JSON數組有4個元素,這時,只要待校驗JSON數組的前三個元素可以經過items中對應的JSON Schema的校驗,咱們就認爲待校驗JSON數組經過了校驗。

例如,若是items的值以下:

{
    "type": "array",
    "items": [
        {
            "type": "string",
            "minLength": 5
        },
        {
            "type": "number",
            "minimum": 10
        },
        {
            "type": "string"
        }
    ]
}
複製代碼

上面的JSON Schema指出了待校驗JSON數組應該知足的條件,數組的第一個元素是string類型,且最小可接受長度爲5,數組的第二個元素是number類型,最小可接受的值爲10,數組的第三個元素是string類型。那麼下面這兩個JSON數組明顯是符合要求的,具體內容以下:

["green", 10, "good"]
["helloworld", 11]
複製代碼

下面這兩個JSON數組倒是不符合要求的,具體內容以下:

["green", 9, "good"]
["good", 12]
複製代碼
  • additionalItems

該關鍵字的值是一個有效的JSON Schema。主要規定除了items內部規定的元素以外的元素規則。只有在items是一個schema數組的時候纔可使用。

須要注意的是,該關鍵字只有在items關鍵字的值爲一組有效的JSON Schema的時候,纔可使用,用於規定超出items中JSON Schema總數量以外的待校驗JSON數組中的剩餘的元素應該知足的校驗邏輯。固然了,只有這些剩餘的全部元素都知足additionalItems的要求時,待校驗JSON數組纔算經過校驗。

其實,你能夠這麼理解,當items的值爲一組有效的JOSN Schema的時候,通常能夠和additionalItems關鍵字組合使用,items用於規定對應位置上應該知足的校驗邏輯,而additionalItems用於規定超出items校驗範圍的全部剩餘元素應該知足的條件。若是兩者同時存在,那麼只有待校驗JSON數組同時經過兩者的校驗,纔算真正地經過校驗。

另外,須要注意的是,若是items只是一個有效的JSON Schema,那麼就不能使用additionalItems,緣由也很簡單,由於items爲一個有效的JSON Schema的時候,其規定了待校驗JSON數組全部元素應該知足的校驗邏輯。additionalItems已經沒有用武之地了。

若是一個additionalItems的值以下:

{
    "type": "array",
    "items": [
        {
            "type": "string",
            "minLength": 5
        },
        {
            "type": "number",
            "minimum": 10
        }
    ],
    "additionalItems": {
        "type": "string",
        "minLength": 2
    }
}
複製代碼

上面的JSON Schema的意思是,待校驗JSON數組第一個元素是string類型,且可接受的最短長度爲5個字符,第二個元素是number類型,且可接受的最小值爲10,剩餘的其餘元素是string類型,且可接受的最短長度爲2。那麼,下面三個JSON數組是可以經過校驗的,具體內容以下:

["green", 10, "good"]
["green", 11]
["green", 10, "good", "ok"]
複製代碼

下面JSON數組是沒法經過校驗的,具體內容以下:

["green", 10, "a"]
["green", 10, "ok", 2]
複製代碼
  • minItems、maxItems

這兩個關鍵字的值都是非負整數。 指定了待校驗JSON數組中元素的個數限制,minItems指定了待校驗JSON數組能夠接受的最少元素個數,而maxItems指定了待校驗JSON數組能夠接受的最多元素個數。

另外,須要注意的是,省略minItems關鍵字和該關鍵字的值爲0,具備相同效果。而,若是省略maxItems關鍵字則表示對元素的最大個數沒有限制。

例如,若是限制一個JSON數組的元素的最大個數爲5,最小個數爲1,則JSON Schema以下:

"minItems": 1,
"maxItems": 5
複製代碼
  • uniqueItems

該關鍵字的值是一個布爾值,即boolean(true、false)。

當該關鍵字的值爲true時,只有待校驗JSON數組中的全部元素都具備惟一性時,才能經過校驗。當該關鍵字的值爲false時,任何待校驗JSON數組都能經過校驗。 另外,須要注意的是,省略該關鍵字和該關鍵字的值爲false時,具備相同的效果。例如:

"uniqueItems": true
複製代碼

當type的值爲integer或者number時

integer和number的區別,integer至關於python中的int類型,而number至關於python中的int或float類型

  • multipleOf

該關鍵字的值是一個大於0的number,便可以是大於0的int,也能夠是大於0的float。只有待校驗的值可以被該關鍵字的值整除,纔算經過校驗。

若是含有該關鍵字的JSON Schema以下:

{
    "type": "integer",
    "multipleOf": 2
}
複製代碼

那麼,二、四、6都是能夠經過校驗的,可是,三、五、7都是沒法經過校驗的,固然了,2.0、4.0也是沒法經過校驗的,可是,並非由於multipleOf關鍵字,而是由於type關鍵字。

若是含有multipleOf關鍵字的JSON Schema以下:

{
    "type": "number",
    "multipleOf": 2.0
}
複製代碼

那麼,二、2.0、四、4.0都是能夠經過校驗的,可是,三、3.0、三、3.0都是沒法經過校驗的。

  • maximum 、exclusiveMaximum

maximum該關鍵字的值是一個number,便可以是int,也能夠是float。該關鍵字規定了待校驗元素能夠經過校驗的最大值。即傳入的值必須小於maximum。 exclusiveMaximum該關鍵字和maximum同樣,規定了待校驗元素能夠經過校驗的最大值,不一樣的是待校驗元素能夠等於exclusiveMaximum指定的值。即比maximum多了一個他自身這個邊界值.

{
    "type": "number",
# 設定 maximum 爲12.3 則傳入值必須小於12.3
# "maximum": 12.3,
# 設定 exclusiveMaximum爲12.3 則傳入值是小於等於12.3
    "exclusiveMaximum": 12.3
}

複製代碼
  • minimum、exclusiveMinimum

minimumexclusiveMinimum關鍵字的用法和含義與maximumexclusiveMaximum類似。惟一的區別在於,一個約束了待校驗元素的最小值,一個約束了待校驗元素的最大值。

當type取值爲string時

  • maxLength

該關鍵字的值是一個非負整數。該關鍵字規定了待校驗JSON元素能夠經過校驗的最大長度,即待校驗JSON元素的最大長度必須小於或者等於該關鍵字的值。

  • minLength

該關鍵字的值是一個非負整數。該關鍵字規定了待校驗JSON元素能夠經過校驗的最小長度,即待校驗JSON元素的最小長度必須大於或者等於該關鍵字的值。

  • pattern

該關鍵字的值是一個正則表達式。只有待校驗JSON元素符合該關鍵字指定的正則表達式,纔算經過校驗。

  • format

該關鍵字的值能夠是如下取值:datedate-time(時間格式)、email(郵件格式)、hostname(網站地址格式)、ipv4ipv6uri等等。

{
    "type": "string",
    "format": "email"
}
複製代碼

使用format關鍵字時,在實例化validator時必須給它傳format_checker參數,fromat_checker參數的值即便各類版本的JSON模式規範的驗證器類,如:

Draft7Validator Draft6Validator Draft4Validator

當你實例化validator時,若是沒有給它傳format_checker參數, jsonschema是不會自動校驗schema中的format關鍵字的.所以,你須要作如下步驟: 1.額外導入JSON Schema某個版本的模式規範如:from jsonschema import draft7_format_checker 2.實例化validator時傳入:validate(instance=json_data, schema=my_schema, format_checker=draft7_format_checker)

全類型可用

  • enum

該關鍵字的值是一個數組,該數組至少要有一個元素,且數組內的每個元素都是惟一的。 若是待校驗的JSON元素和數組中的某一個元素相同,則經過校驗。不然,沒法經過校驗。

**注意:**該數組中的元素值能夠是任何值,包括null。省略該關鍵字則表示無須對待校驗元素進行該項校驗。例如:

{
    "type": "number",
    "enum": [2, 3, null, "hello"]
}
複製代碼
  • const

該關鍵字的值能夠是任何值,包括null。若是待校驗的JSON元素的值和該關鍵字指定的值相同,則經過校驗。不然,沒法經過校驗。

  • allOf

該關鍵字的值是一個非空數組,數組裏面的每一個元素都必須是一個有效的JSON Schema。 只有待校驗JSON元素經過數組中全部的JSON Schema校驗,纔算真正經過校驗。

  • anyOf

該關鍵字的值是一個非空數組,數組裏面的每一個元素都必須是一個有效的JSON Schema。 若是待校驗JSON元素可以經過數組中的任何一個~~~~JSON Schema校驗,就算經過校驗。

  • oneOf

該關鍵字的值是一個非空數組,數組裏面的每一個元素都必須是一個有效的JSON Schema。 若是待校驗JSON元素能且只能經過數組中的某一個JSON Schema校驗,纔算真正經過校驗。不能經過任何一個校驗和能經過兩個及以上的校驗,都不算真正經過校驗。

  • not

該關鍵字的值是一個JSON Schema。只有待校驗JSON元素不能經過該關鍵字指定的JSON Schema校驗的時候,待校驗元素纔算經過校驗。

  • default

該關鍵字的值是沒有任何要求的。該關鍵字經常用來指定待校驗JSON元素的默認值,固然,這個默認值最好是符合要求的,即可以經過相應的JSON Schema的校驗。 另外,須要注意的是,該關鍵字除了提示做用外,並不會產生任何實質性的影響。

type關鍵字

須要特別注意的是,type關鍵字的值能夠是一個string,也能夠是一個數組。 若是type的值是一個string,則其值只能是如下幾種:null、boolean、object、array、number、string、integer。 若是type的值是一個數組,則數組中的元素都必須是string,且其取值依舊被限定爲以上幾種。只要帶校驗JSON元素是其中的一種,則經過校驗。

**注意,**以上JSON Schema只是爲了展現部分關鍵字的用法,可能和實際應用略有不一樣。

dependencies關鍵字

依賴關係

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  
  "properties": {
  },
  "dependencies": {
    "age": [
      "name"
    ]
  },
 
}

複製代碼

上述schema表示,age依賴於name,若是age出現,name必須出現

$ref關鍵字

使用該關鍵字能夠引用一個規範

"warehouseLocation": {
      "description": "Coordinates of the warehouse where the product is located.",
      "$ref": "https://example.com/geographical-location.schema.json"
    }

複製代碼

if-then-else 關鍵字

{
  "$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"
    ]
  }
}


複製代碼

符合上述規則的json(最簡單的兩種方式):

{
  "foo": "bar22",
  "cc": 123
}


{
  "foo": "bar",
  "bar": "123"
}

複製代碼

概述:

if條件爲:key爲foo的值是bar或者123 返回true,不然返回false
if返回true執行thenthen的規則,bar必須存在
if返回false執行else
    else規則,cc必須存在
複製代碼

官方的參考文檔以下: json-schema.org/latest/json… json-schema.org/implementat…

本文參考:www.cnblogs.com/ChangAn223/…

結尾

好記性不如爛筆頭,本文爲我的學習總結。

  • 筆者:shaofeer
  • 我的網站(首發):quxuecx.com
  • 郵箱: shaofeer@163.com
  • QQ:337081267
  • 公衆號:「趣學程序」

我這裏整理了不少的學習資料、編程源碼、學習筆記、面試心得,若是有須要,能夠經過關注「趣學程序」公衆號來獲取喲~

20200703005907544_13701
相關文章
相關標籤/搜索