利用JSON Schema校验JSON数据格式
最近筆者在工作中需要監(jiān)控一批http接口,并對(duì)返回的JSON數(shù)據(jù)進(jìn)行校驗(yàn)。正好之前在某前端大神的分享中得知這個(gè)神器的存在,調(diào)研一番之后應(yīng)用在該項(xiàng)目中,并取得了不錯(cuò)的效果,特地在此分享給各位讀者。
什么是JSON Schema?
JSON Schema是一組特殊的JSON詞匯,用來(lái)標(biāo)記和校驗(yàn)JSON數(shù)據(jù),也可以理解為一種的對(duì)JSON數(shù)據(jù)格式定義的約定。截至本文撰寫(xiě)時(shí)間,該約定的草案已經(jīng)演進(jìn)至第7版(draft-07)。JSON Schema使用一種人機(jī)都容易理解的方式來(lái)描述已有的數(shù)據(jù)格式。可用于客戶端校驗(yàn)用戶提交,或者自動(dòng)化測(cè)試中校驗(yàn)結(jié)果。
如何獲取JSON Schema?
JSON Schema在各常用語(yǔ)言下基本都有實(shí)現(xiàn),包括:C/C++, Java, JavaScript, PHP, Python, Scala, Go等,不同語(yǔ)言的實(shí)現(xiàn)對(duì)約定草案的支持程度不盡相同,單就筆者在自動(dòng)化測(cè)試中進(jìn)行接口返回格式校驗(yàn)的需求來(lái)說(shuō)均可滿足。
各位讀者可以在官網(wǎng)鏈接中獲取JSON Schema在不同語(yǔ)言中的實(shí)現(xiàn),請(qǐng)按需取用~
JSON Schema的用法
用過(guò)JSON的同學(xué)都知道,JSON是構(gòu)建在以下幾種數(shù)據(jù)結(jié)構(gòu)上的:
1.object:
{"name": "picotaro", "age": 38}
2.array:
["apple", "pen", "pineapple"]
3.number:
10086
3.1415926
4.string:
"pen pinapple apple pen"
5.boolean:
true
false
6.null:
null
通過(guò)上述這六種數(shù)據(jù)格式,我們可以自由組合出復(fù)雜的JSON數(shù)據(jù),比如:
上面兩個(gè)都是有效的JSON數(shù)據(jù),那么當(dāng)我們需要對(duì)接口返回進(jìn)行校驗(yàn)時(shí),我們?cè)撛趺醋瞿兀恳话愕奶交畋O(jiān)控可以通過(guò)http碼或者錯(cuò)誤碼來(lái)進(jìn)行識(shí)別結(jié)果是否正確,但如果我們需要精準(zhǔn)校驗(yàn)json數(shù)據(jù)的格式呢?難道我們要寫(xiě)一套復(fù)雜的通用邏輯來(lái)處理么?不,這個(gè)時(shí)候我們用JSON Schema就可以啦(眾人:少?gòu)U話,show me the code)。
假設(shè)我們需要接口的回顯為第一種格式的數(shù)據(jù),那么我們可以定義如下的JSON Schema來(lái)描述接口:
你可能已經(jīng)注意到JSON Schema本身就是一個(gè)JSON數(shù)據(jù),因?yàn)槠浔旧砭褪且欢螖?shù)據(jù)而非程序,只是一種"描述其他數(shù)據(jù)的結(jié)構(gòu)"的描述性格式而已,然后校驗(yàn)器會(huì)根據(jù)這個(gè)schema來(lái)判斷數(shù)據(jù)是否滿足要求。就目前情況來(lái)說(shuō),第一種會(huì)通過(guò),而第二種就會(huì)失敗。就這樣,我們通過(guò)利用一些簡(jiǎn)單的、配置式的定義來(lái)完成復(fù)雜JSON數(shù)據(jù)的校驗(yàn)工作。
以下是上面出現(xiàn)過(guò)的配置項(xiàng)的含義:
1.type: 規(guī)定值的類(lèi)型
2.required: 規(guī)定object下哪些鍵是必須的
3.properties: 規(guī)定object下鍵的格式
4.const: @since draft-07,常量,值必須等于該常量
5.enum: 枚舉值,即值只能是enum數(shù)組中的某一項(xiàng)
6.maxLength: 規(guī)定字符串的最大長(zhǎng)度
7.maximum: 規(guī)定數(shù)字的最大值
8.minimum: 規(guī)定數(shù)字的最小值
9.minItems: 規(guī)定數(shù)組元素的最少個(gè)數(shù)
怎么樣,是不是覺(jué)得非常簡(jiǎn)單?下一節(jié)是可用的配置項(xiàng)信息,可以結(jié)合自己的實(shí)際需要來(lái)編寫(xiě)配置。
配置項(xiàng)
因最新草案(draft-07)的支持尚不夠廣泛,本文的配置項(xiàng)以舊版(draft-04)為準(zhǔn)。
通用配置
1.type: string/array, 規(guī)定值的類(lèi)型只能從6個(gè)基礎(chǔ)類(lèi)型中選擇:number/integer, string, object, array, boolean, null
2.enum: array, 規(guī)定值必須等于該枚舉數(shù)組中的某一項(xiàng)
number/integer
number和integer作為共享關(guān)鍵字,不得同時(shí)出現(xiàn)。兩者分別表示數(shù)字和整形
1.multipleOf: number, 規(guī)定值必須為該項(xiàng)的倍數(shù)
2.maximum: number, 規(guī)定值必須小于等于該項(xiàng)
3.exclusiveMaximum: boolean, 如果出現(xiàn)該項(xiàng)且不為false,那么值就必須小于maximum
4.minimum: number, 規(guī)定值必須大于等于該項(xiàng)
5.exclusiveMinimum: boolean, 如果出現(xiàn)該項(xiàng)且不為false,那么值就必須大于minimum
string
1.maxLength: integer, 規(guī)定值的長(zhǎng)度必須小于等于該項(xiàng)
2.minLength: integer, 規(guī)定值的長(zhǎng)度必須大于等于該項(xiàng)
3.pattern: string, 正則表達(dá)式,規(guī)定值必須匹配該項(xiàng)
object
1.maxProperties: integer, 規(guī)定值所包含的鍵值個(gè)數(shù)必須小于等于該項(xiàng)
2.minProperties: integer, 規(guī)定值所包含的鍵值個(gè)數(shù)必須大于等于該項(xiàng)
3.required: array, 規(guī)定哪些鍵必須出現(xiàn)
4.properties: object, 該項(xiàng)的鍵為值中可能出現(xiàn)的鍵,該項(xiàng)的值為有效的schema數(shù)據(jù)。參考上一節(jié)的例子
5.patternProperties: object, 該項(xiàng)的鍵為正則表達(dá)式,用以匹配可能出現(xiàn)鍵,該項(xiàng)的值為有效的schema數(shù)據(jù)
Example:
6.additionalProperties: boolean/object, 該項(xiàng)比較復(fù)雜
6.1.如果出現(xiàn)該項(xiàng)且為false,那么當(dāng)對(duì)象所有的鍵經(jīng)過(guò)properties和patternProperties匹配后仍有剩余的,即出錯(cuò)
6.2.如果該項(xiàng)為object,那么其中定義了經(jīng)過(guò)properties和patternProperties匹配后剩余的鍵的特性
Example:
7.dependencies: object, 如果出現(xiàn)了某個(gè)鍵則其依賴的鍵也必須出現(xiàn)
7.1.屬性依賴, 則dependencies中每個(gè)鍵的值為array,數(shù)組的元素該鍵的依賴
Example:
7.2.schema依賴,則dependencies中每個(gè)鍵的值為object,該對(duì)象中通過(guò)properties指定其依賴的鍵
Example:
array
1.items: 規(guī)定每個(gè)元素的特性
1.1.object, 一個(gè)有效的schema,對(duì)所有數(shù)據(jù)的元素應(yīng)用該校驗(yàn)方式
Example:
1.2.array,每個(gè)元素均為一個(gè)有效的schema,用一一對(duì)應(yīng)的方式對(duì)數(shù)組中的元素進(jìn)行校驗(yàn)
Example:
2.additionalItems: boolean, 如果出現(xiàn)該項(xiàng)且為false,那么items中值為array的情況下,對(duì)應(yīng)數(shù)據(jù)中不可出現(xiàn)額外的項(xiàng)
Example:
3.maxItems: integer, 規(guī)定元素個(gè)數(shù)必須小于等于該項(xiàng)
4.minItems: integer,規(guī)定元素個(gè)數(shù)必須大于等于該項(xiàng)
5.uniqueItems: boolean, 如果出現(xiàn)該項(xiàng)且為true,那么數(shù)組中的每個(gè)元素都不能相同
boolean
無(wú)單獨(dú)配置項(xiàng)
null
無(wú)單獨(dú)配置項(xiàng)
小結(jié)
有了JSON Schema這個(gè)神器,接口測(cè)試的數(shù)據(jù)校驗(yàn)變得簡(jiǎn)單了不少,作為接口監(jiān)控腳本的一部分,也很容易知道結(jié)果中哪部分出了問(wèn)題。實(shí)在是居家旅行、測(cè)試開(kāi)發(fā),必備良藥。
轉(zhuǎn)自:https://mp.weixin.qq.com/s/iWAyKpdbN3pVwKKJDyGstA
---------------------------------------------------------------------------------
關(guān)注微信公眾號(hào)即可在手機(jī)上查閱,并可接收更多測(cè)試分享~
總結(jié)
以上是生活随笔為你收集整理的利用JSON Schema校验JSON数据格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《狗子放置3》新手玩法攻略-狗子放置3新
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?