利用JSON Schema校驗JSON數據格式

最近筆者在工做中須要監控一批http接口,並對返回的JSON數據進行校驗。正好以前在某前端大神的分享中得知這個神器的存在,調研一番以後應用在該項目中,並取得了不錯的效果,特意在此分享給各位讀者。前端

什麼是JSON Schema?正則表達式

       JSON Schema是一組特殊的JSON詞彙,用來標記和校驗JSON數據,也能夠理解爲一種的對JSON數據格式定義的約定。截至本文撰寫時間,該約定的草案已經演進至第7版(draft-07)。JSON Schema使用一種人機都容易理解的方式來描述已有的數據格式。可用於客戶端校驗用戶提交,或者自動化測試中校驗結果。json

如何獲取JSON Schema?數組

       JSON Schema在各經常使用語言下基本都有實現,包括:C/C++, Java, JavaScript, PHP, Python, Scala, Go等,不一樣語言的實現對約定草案的支持程度不盡相同,單就筆者在自動化測試中進行接口返回格式校驗的需求來講都可知足。數據結構

       各位讀者能夠在官網連接中獲取JSON Schema在不一樣語言中的實現,請按需取用~app

JSON Schema的用法測試

用過JSON的同窗都知道,JSON是構建在如下幾種數據結構上的:ui

1.object:3d

       {"name": "picotaro", "age": 38}code

2.array:

       ["apple", "pen", "pineapple"]

3.number:

       10086

        3.1415926

 4.string:

        "pen pinapple apple pen"

5.boolean:

        true

        false

6.null:

        null

經過上述這六種數據格式,咱們能夠自由組合出複雜的JSON數據,好比:

       上面兩個都是有效的JSON數據,那麼當咱們須要對接口返回進行校驗時,咱們該怎麼作呢?通常的探活監控能夠經過http碼或者錯誤碼來進行識別結果是否正確,但若是咱們須要精準校驗json數據的格式呢?難道咱們要寫一套複雜的通用邏輯來處理麼?不,這個時候咱們用JSON Schema就能夠啦(衆人:少廢話,show me the code)。

       假設咱們須要接口的回顯爲第一種格式的數據,那麼咱們能夠定義以下的JSON Schema來描述接口:

       你可能已經注意到JSON Schema自己就是一個JSON數據,由於其自己就是一段數據而非程序,只是一種"描述其餘數據的結構"的描述性格式而已,而後校驗器會根據這個schema來判斷數據是否知足要求。就目前狀況來講,第一種會經過,而第二種就會失敗。就這樣,咱們經過利用一些簡單的、配置式的定義來完成複雜JSON數據的校驗工做。

如下是上面出現過的配置項的含義:

  1.type: 規定值的類型

  2.required: 規定object下哪些鍵是必須的

  3.properties: 規定object下鍵的格式

  4.const: @since draft-07,常量,值必須等於該常量

  5.enum: 枚舉值,即值只能是enum數組中的某一項

  6.maxLength: 規定字符串的最大長度

  7.maximum: 規定數字的最大值

  8.minimum: 規定數字的最小值

  9.minItems: 規定數組元素的最少個數

       怎麼樣,是否是以爲很是簡單?下一節是可用的配置項信息,能夠結合本身的實際須要來編寫配置。

配置項

       因最新草案(draft-07)的支持尚不夠普遍,本文的配置項以舊版(draft-04)爲準。

通用配置

 1.type: string/array, 規定值的類型只能從6個基礎類型中選擇:number/integer, string, object, array, boolean, null

  2.enum: array, 規定值必須等於該枚舉數組中的某一項

number/integer

number和integer做爲共享關鍵字,不得同時出現。二者分別表示數字和整形

  1.multipleOf: number, 規定值必須爲該項的倍數

  2.maximum: number, 規定值必須小於等於該項

  3.exclusiveMaximum: boolean, 若是出現該項且不爲false,那麼值就必須小於maximum

  4.minimum: number, 規定值必須大於等於該項

  5.exclusiveMinimum: boolean, 若是出現該項且不爲false,那麼值就必須大於minimum

string

  1.maxLength: integer, 規定值的長度必須小於等於該項

  2.minLength: integer, 規定值的長度必須大於等於該項

  3.pattern: string, 正則表達式,規定值必須匹配該項

object

  1.maxProperties: integer, 規定值所包含的鍵值個數必須小於等於該項

  2.minProperties: integer, 規定值所包含的鍵值個數必須大於等於該項

  3.required: array, 規定哪些鍵必須出現

  4.properties: object, 該項的鍵爲值中可能出現的鍵,該項的值爲有效的schema數據。參考上一節的例子

  5.patternProperties: object, 該項的鍵爲正則表達式,用以匹配可能出現鍵,該項的值爲有效的schema數據

Example:

  6.additionalProperties: boolean/object, 該項比較複雜

   6.1.若是出現該項且爲false,那麼當對象全部的鍵通過properties和patternProperties匹配後仍有剩餘的,即出錯

     6.2.若是該項爲object,那麼其中定義了通過properties和patternProperties匹配後剩餘的鍵的特性

Example:

  7.dependencies: object, 若是出現了某個鍵則其依賴的鍵也必須出現

     7.1.屬性依賴, 則dependencies中每一個鍵的值爲array,數組的元素該鍵的依賴

Example:

      7.2.schema依賴,則dependencies中每一個鍵的值爲object,該對象中經過properties指定其依賴的鍵

Example:

array

 1.items: 規定每一個元素的特性

     1.1.object, 一個有效的schema,對全部數據的元素應用該校驗方式

Example:

     1.2.array,每一個元素均爲一個有效的schema,用一一對應的方式對數組中的元素進行校驗

Example:

 2.additionalItems: boolean, 若是出現該項且爲false,那麼items中值爲array的狀況下,對應數據中不可出現額外的項

Example:

 3.maxItems: integer, 規定元素個數必須小於等於該項

 4.minItems: integer,規定元素個數必須大於等於該項

 5.uniqueItems: boolean, 若是出現該項且爲true,那麼數組中的每一個元素都不能相同

boolean

無單獨配置項

null

無單獨配置項

小結

       有了JSON Schema這個神器,接口測試的數據校驗變得簡單了很多,做爲接口監控腳本的一部分,也很容易知道結果中哪部分出了問題。實在是居家旅行、測試開發,必備良藥。

 

轉自:https://mp.weixin.qq.com/s/iWAyKpdbN3pVwKKJDyGstA

相關文章
相關標籤/搜索