最近笔者在工作中需要监控一批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数据的校验工作。

以下是上面出现过的配置项的含义:

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

利用JSON Schema校验JSON数据格式的更多相关文章

  1. JSON Schema 校验实例

    JSON Schema 简介 JSON Schema is a vocabulary that allows you to annotate and validate JSON documents. ...

  2. Json.Net使用JSON Schema验证JSON格式

    Json.NET supports the JSON Schema standard via the JsonSchema and JsonValidatingReader classes. It s ...

  3. json schema校验

    工作中使用到了json schema格式校验的问题,在网上查了些资料,结合自己的理解记录一下. json schema可以对json结果字符串做出一些约束,例如: 1. 值类型是:array, obj ...

  4. Json.Net使用JSON Schema验证JSON格式【实例】

    给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...

  5. 利用JsonSchema校验json数据内容的合规性(转)

    原文地址:Json schema 背景: 复杂的AJAX应用程序可以与数百个不同的JSON服务进行交互,因此,引入对客户端验证的需求. 在处理校验问题方面有着很多的工具,但是通常可以将它们归为以下几类 ...

  6. 3 分钟了解 JSON Schema

    大家好,我不是鱼皮. 幸运又不幸,我是一名程序员,他也是一名程序员. 周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在! 今天,他遇到了一个后 ...

  7. Json Schema简介

    1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...

  8. Json schema 以及在python中的jsonschema

    目录 1. JSON Schema简介 2. JSON Schema关键字详解 2.1 $schema 2.2 title和description 2.3 type 3 type常见取值 3.1 当t ...

  9. 使用 Json Schema 定义 API

    本文地址:使用 Json Schema 定义 API 前面我们介绍了 Json Schema 的基本内容,这篇文章我们结合 jsonschema2pojo 工具深入分析如何使用 Json Schema ...

随机推荐

  1. 简要的谈一谈我对CSS中长度单位的理解

    CSS中的长度单位目前分为两种,分别是绝对长度和相对长度.绝对长度单位包括: in:英寸 cm:厘米 mm:毫米 pt:磅(1磅等于1/72英寸) pc:pica(1pica等于12磅) 以上五个就是 ...

  2. ElasticSearch搜索服务技术

    ElasticSearch 基于的lucene开发的搜索服务技术;天生支持分布式; Es的结构 gatway:存储层,所有的数据可以存储在本地(多个es节点形成分布式存储),hdfs输出位置,共享文件 ...

  3. Mongodb使用命令总结

    使用时的Mongodb版本为:3.2 1.导出: mongoexport --host mongodb1.example.net --port 37017 --username user --pass ...

  4. Oracle恢复误删数据

    1.先查出被删除的时间点: select * from flashback_transaction_query where table_name='表名'; 2.根据时间点恢复数据: insert i ...

  5. JavaScript Event Loop和微任务、宏任务

    为什么JavaScript是单线程? JavaScript的一大特点就是单线程, 同一时间只能做一件事情,主要和它的用途有关, JavaScript主要是控制和用户的交互以及操作DOM.注定它是单线程 ...

  6. Eclipse新导入的项目中ctrl+点击指定方法名或类名没有反应,不能跳转问题

    项目没有转成java项目 解决方法:右击项目名---选择properties----点击Project Facets,这样就可以实现ctrl+左键点击跳转了. 转成java项目后会报错 解决办法:选中 ...

  7. SpringBoot使用maven插件打包時報:[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException的處理方案

    SpringBoot使用maven插件打包時報:[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExec ...

  8. 用Jquery控制元素的上下移动 实现排序功能

    在页面上,控制元素上下移动,进行排序是我们比较常用的功能,今天我用jQuery 写个 简单方便,功能齐全的实现方式. 话不多说,直接上代码,下面是基础的引入jq和html元素部分: <scrip ...

  9. ASP.NET Core获取微信订单数据

    前几天对接了一波微信的订单,分享出来 1.生成签名 根据微信要求把appid.商户号.随机数.和订单号还有商户平台的密钥拼接成一个字符串然后进行MD5加密 2.拼接请求XML 然后用拼接好的XML向微 ...

  10. 微信支付tp5.1集合

    多商户号微信支付 配置 自己改一改 逻辑 就好了! 写的菜 勿喷 extend下面 主要目录 多商户号 配置项 根据自己的需求更改 可能有一些地方存在BUG 自己调试一下 就OK了,别像一个麻瓜一样 ...