如何利用JSON Schema校验JSON数据格式

   最近笔者在工作中需要监控一批http接口,并对返回的JSON数据进行校验。正好之前在某前端大神的分享中得知这个神器的存在,调研一番之后应用在该项目中,并取得了不错的效果,特地在此分享给各位读者。<br style="box-sizing: border-box;"/>

什么是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}<br style="box-sizing: border-box;"/>

2.array:

["apple", "pen", "pineapple"]<br style="box-sizing: border-box;"/>

3.number:

10086 3.1415926<br style="box-sizing: border-box;"/>

4.string:

"pen pinapple apple pen"<br style="box-sizing: border-box;"/>

5.boolean:

true false<br style="box-sizing: border-box;"/>

6.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这个神器,接口测试的数据校验变得简单了不少,作为接口监控脚本的一部分,也很容易知道结果中哪部分出了问题。实在是居家旅行、测试开发,必备良药。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 IIC 实验

1. 可以选择I2C1&#xff0c;也可以选择I2C2&#xff0c;或者同时选择&#xff0c;同时运行 配置时钟信号 为节约空间&#xff0c;选择这两个&#xff0c;然后选择GENERATE CODE 二、HAL_I2C_Mem_Write I2C_HandleTypeDef *hi2c&#xff1a;I2C设备句柄 uint16_t DevAddress&am…

目标检测YOLO系列从入门到精通技术详解100篇-【图像处理】图像分割

目录 前言 知识储备 图像处理常用算法 算法原理 传统分割方法 1.基于阈值的分割方法

IDEA JAVA项目 导入JAR包,打JAR包 和 JAVA运行JAR命令提示没有主清单属性

一、导入JAR包 1、java项目在没有导入该jar包之前&#xff0c;如图&#xff1a;2、点击 File -> Project Structure&#xff08;快捷键 Ctrl Alt Shift s&#xff09;&#xff0c;点击Project Structure界面左侧的“Modules”如图&#xff1a;3.在 “Dependencies” 标签…

《006.Springboot+vue之旅游信息推荐系统》【有文档】

《006.Springbootvue之旅游信息推荐系统》【有文档】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; …

nodejs express uniapp 图书借阅管理系统源码

开发环境及工具&#xff1a; nodejs&#xff0c;mysql5.7&#xff0c;HBuilder X&#xff0c;vscode&#xff08;webstorm&#xff09; 技术说明&#xff1a; nodejs express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示轮播图&am…

Ubuntu20.04换源教程、解决主机与虚拟机之间进行文本复制粘贴问题

Ubuntu20.04换源教程&#xff1a; 1.打开终端 2.备份原有的软件源列表文件&#xff1a; sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3.打开软件源列表文件进行编辑&#xff1a; sudo gedit /etc/apt/sources.list 4.更换新的软件源配置信息(eg:阿里云源&a…

为全志T507-H开发板配置Samba服务,高效实现跨系统的文件共享

作为一款经典的国产芯&#xff0c;全志T507-H芯片被广泛应用于车载电子、电力、医疗、工业控制、物联网、智能终端等诸多领域当中&#xff0c;而在各种复杂的嵌入式Linux应用场景当中&#xff0c;“打通ARM板卡与Windows设备间的壁垒以实现跨平台的文件共享”是一项不能被忽视的…

电脑风扇控制软件 Macs Fan Control Pro mac中文版功能介绍

Macs Fan Control mac是一款专门为 Mac 用户设计的软件&#xff0c;它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度&#xff0c;以提高设备的散热效果&#xff0c;减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温…

(三)Spring源码解析:自定义标签解析

一、使用示例 步骤1&#xff1a;创建User实体 步骤2&#xff1a;定义一个XSD文件描述组件内容 步骤3&#xff1a;创建BeanDefinitionParser接口的实现类&#xff0c;用来解析XSD文件中的定义和组件定义。 步骤4&#xff1a;创建NamespaceHandlerSupport实现类&#xff0c;目的…

多门店自助点餐+外卖二合一小程序源码系统 带完整搭建教程

随着餐饮业的快速发展和互联网技术的不断进步&#xff0c;越来越多的餐厅开始采用自助点餐和外卖服务。市场上许多的外卖小程序APP应运而生。下面罗峰来给大家介绍一款多门店自助点餐外卖二合一小程序源码系统。该系统结合了自助点餐和外卖服务的优势&#xff0c;为餐厅提供了一…

Redis极速上手开发手册【Redis全面复习】

文章目录 什么是RedisRedis的特点Redis的应用场景Redis安装部署Redis基础命令Redis多数据库特性Redis数据类型Redis数据类型之stringRedis数据类型之hashRedis数据类型之listRedis数据类型之setRedis数据类型之sorted set案例&#xff1a;存储高一班的学员信息 Redis封装工具类…

解决Java中https请求接口报错问题

1. 解决SSLException: Certificate for &#xff1c;域名&#xff1e; doesn‘t match any of the subject alternative报错问题 1.1 问题描述 最近在做一个智能问答客服项目&#xff0c;对接的是云问接口&#xff0c;然后云问接口对接使用的是https方式&#xff0c;之前一直…

【Vue】组件封装小技巧 — 利用$listener和v-on接收父组件传递的事件

在Vue.js中进行二次封装组件时&#xff0c;$listener是一个非常有用的工具&#xff0c;它允许你轻松地传递父组件的事件监听器到内部元素。 什么是二次封装组件&#xff1f; 二次封装组件是指将一个已存在的组件包装在一个自定义组件中&#xff0c;以添加额外的功能、样式或逻…

「随笔」浅谈2023年云计算的发展趋势

在2023年&#xff0c;云计算的发展趋势将受到政治、经济、社会和科技四个维度的影响。以下是对这些维度的具体分析&#xff1a; 1.1 政治维度&#xff1a; 全球政策推动&#xff1a; 随着全球各国政策对云计算的重视程度不断提高&#xff0c;云计算服务将获得更广泛的市场准入…

浅谈指针函数、函数指针、指针数组、数组指针 简单明了!!!!

指针函数 形如&#xff1a;int* fun(int a, int b) 类比于&#xff1a;int fun(int x, int y)、char fun(int x, int y) 本质上是函数&#xff0c;只是返回值为int类型的指针&#xff0c;以此类推可以有void*、char*、unsigned char*类型等指针&#xff0c;类比于返回值是int …

蓝桥杯-成绩统计[Java]

目录: 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 题目&#xff1a; 题目描述: 输入描述: 输出描述: 输入输出样例: 示例 1: 运行限制: 题解: 思路: 学习目标&#xff1a; 刷蓝桥杯题库日记 学习内容&#xff1a; 编号502题目成绩统计难度…

产品经理墨刀学习----注册页面

我们做的产品是一个校园论坛学习开发系统&#xff0c;目前才开始学习。 &#xff08;一&#xff09;流程图 &#xff08;二&#xff09;简单墨刀设计--注册页面 &#xff08;1&#xff09;有账号 &#xff08;a&#xff09;直接登录&#xff1a; &#xff08;b&#xff09;忘…

LeetCode 318. 最大单词长度乘积

给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。如果不存在这样的两个单词&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xff1a;words ["abcw","baz"…

什么是Target Plus EDI?

“Target Plus” 是美国知名零售商Target&#xff08;塔吉特&#xff09;推出的一个合作伙伴计划。这个计划允许第三方卖家在Target.com&#xff08;塔吉特官方网站&#xff09;上销售他们的商品。通过Target Plus&#xff0c;第三方卖家可以将他们的产品列在Target.com上&…