利⽤JSONSchema校验JSON数据格式
最近笔者在⼯作中需要监控⼀批http接⼝,并对返回的JSON数据进⾏校验。正好之前在某前端⼤神的分享中得知这个神器的存在,调研⼀番之后应⽤在该项⽬中,并取得了不错的效果,特地在此分享给各位读者。
什么是JSON Schema?
JSON Schema是⼀组特殊的JSON词汇,⽤来标记和校验JSON数据,也可以理解为⼀种的对JSON数据格式定义的约定。截⾄本⽂撰写时间,该约定的草案已经演进⾄第7版(draft-07)。JSON Schema使⽤⼀种⼈机都容易理解的⽅式来描述已有的数据格式。可⽤于客户端校验⽤户提交,或者⾃动化测试中校验结果。
如何获取JSON Schema?
JSON Schema在各常⽤语⾔下基本都有实现,包括:C/C++, Java, JavaScript, PHP, Python, Scala, Go等,不同语⾔的实现对约定草案的⽀持程度不尽相同,单就笔者在⾃动化测试中进⾏接⼝返回格式校验的需求来说均可满⾜。
各位读者可以在官⽹链接中获取JSON Schema在不同语⾔中的实现,请按需取⽤~
JSON Schema的⽤法
⽤过JSON的同学都知道,JSON是构建在以下⼏种数据结构上的:
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
通过上述这六种数据格式,我们可以⾃由组合出复杂的JSON数据,⽐如:
上⾯两个都是有效的JSON数据,那么当我们需要对接⼝返回进⾏校验时,我们该怎么做呢?⼀般的探活监控可以通过http码或者错误码来进⾏识别结果是否正确,但如果我们需要精准校验json数据的格式呢?难道我们要写⼀套复杂的通⽤逻辑来处理么?不,这个时候我们⽤JSON Schema就可以啦(众⼈:少废话,show me the code)。
假设我们需要接⼝的回显为第⼀种格式的数据,那么我们可以定义如下的JSON Schema来描述接⼝:
你可能已经注意到JSON Schema本⾝就是⼀个JSON数据,因为其本⾝就是⼀段数据⽽⾮程序,只是⼀
种"描述其他数据的结构"的描述性格式⽽已,然后校验器会根据这个schema来判断数据是否满⾜要求。就⽬前情况来说,第⼀种会通过,⽽第⼆种就会失败。就这样,我们通过利⽤⼀些简单的、配置式的定义来完成复杂JSON数据的校验⼯作。
以下是上⾯出现过的配置项的含义:
3.properties: 规定object下键的格式
enum怎么用
6.maxLength: 规定字符串的最⼤长度
7.maximum: 规定数字的最⼤值
8.minimum: 规定数字的最⼩值
9.minItems: 规定数组元素的最少个数
怎么样,是不是觉得⾮常简单?下⼀节是可⽤的配置项信息,可以结合⾃⼰的实际需要来编写配置。
配置项
因最新草案(draft-07)的⽀持尚不够⼴泛,本⽂的配置项以旧版(draft-04)为准。
通⽤配置
number/integer
number和integer作为共享关键字,不得同时出现。两者分别表⽰数字和整形
1.multipleOf: number, 规定值必须为该项的倍数
2.maximum: number, 规定值必须⼩于等于该项
4.minimum: number, 规定值必须⼤于等于该项
string
1.maxLength: integer, 规定值的长度必须⼩于等于该项
2.minLength: integer, 规定值的长度必须⼤于等于该项
3.pattern: string, 正则表达式,规定值必须匹配该项
object
1.maxProperties: integer, 规定值所包含的键值个数必须⼩于等于该项
2.minProperties: integer, 规定值所包含的键值个数必须⼤于等于该项
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这个神器,接⼝测试的数据校验变得简单了不少,作为接⼝监控脚本的⼀部分,也很容易知道结果中哪部分出了问题。实在是居家旅⾏、测试开发,必备良药。
---------------------------------------------------------------------------------
关注即可在⼿机上查阅,并可接收更多测试分享~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论