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

news2024/11/25 19:40:08

   最近笔者在工作中需要监控一批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.coloradmin.cn/o/1182968.html

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

相关文章

Moco框架初探

一、简介 Moco是一个搭建模拟服务器的工具&#xff0c;其支持API和独立运行两种方式&#xff0c;前者通常在junit等测试框架中使用&#xff0c;后者则是通过运行一个jar包开启服务。 二、用途 主要用于实现mock技术 1、后端接口开发未完成情况下&#xff0c;通过moco模拟接…

JavaWeb课程复习资料——idea创建JDBC

1、创建空的Java Project 输入项目名称 空项目 2、引入jar包步骤 依次点击 File -> Project Structure&#xff08;快捷键 Ctrl Alt Shift s&#xff09;&#xff0c;点击Project Structure界面左侧的“Modules”如图&#xff1a; 在 【Dependencies】 标签界面下&…

C语言学习笔记之结构篇

C语言是一门结构化程序设计语言。在C语言看来&#xff0c;现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象&#xff0c;即顺序&#xff0c;分支&#xff08;选择&#xff09;&#xff0c;循环。 所谓顺序就是一条路走到黑&#xff1b;生活中在很多事情上我们都…

MVCC中的可见性算法

在之前的文章 MVCC详解-CSDN博客中我们已经介绍过了MVCC的原理&#xff08;read viewundo log&#xff09;&#xff0c;今天来详细的说一下readview的匹配规则&#xff08;可见性算法&#xff09; 隔离级别在RC&#xff0c;RR的前提下 Read View是如何保证可见性判断的呢&#…

微服务-grpc

微服务 一、微服务&#xff08;microservices&#xff09; 近几年,微服这个词闯入了我们的视线范围。在百度与谷歌中随便搜一搜也有几千万条的结果。那么&#xff0c;什么是微服务 呢&#xff1f;微服务的概念是怎么产生的呢&#xff1f; 我们就来了解一下Go语言与微服务的千丝…

机器学习——回归

目录 一、线性回归 1、回归的概念&#xff08;Regression、Prediction&#xff09; 2、符号约定 3、算法流程 4、最小二乘法&#xff08;LSM&#xff09; 二、梯度下降 梯度下降的三种形式 1、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09;&#xff…

Unity地面交互效果——4、制作地面凹陷轨迹

大家好&#xff0c;我是阿赵。   上一篇介绍了曲面细分着色器的基本用法和思路&#xff0c;这一篇在曲面细分的基础上&#xff0c;制作地面凹陷的轨迹效果。 一、思路分析 这次需要达到的效果是这样的&#xff1a; 从效果上看&#xff0c;这个凹陷在地面下的轨迹&#xff0…

BigDecimal使用的时候需要注意什么?

BigDecimal只要涉及到浮点数运算都会用到BigDecimal&#xff0c;并且面试的时候经常会问到&#xff0c;那么BigDecimal使用的时候需要注意什么&#xff1f; 目录 1.为什么不能用浮点数表示金额&#xff1f;2.十进制转换二进制3.科学记数法4.IEEE 7545.在线浮点数转换二进制6.原…

Go uuid库介绍

简介&#xff1a; 在现代软件开发中&#xff0c;全球唯一标识符&#xff08;UUID&#xff09;在许多场景中发挥着重要的作用。UUID是一种128位的唯一标识符&#xff0c;它能够保证在全球范围内不重复。在Go语言中&#xff0c;我们可以使用第三方库github.com/google/uuid来方便…

怎样在iOS手机上进行自动化测试

Airtest支持iOS自动化测试&#xff0c;在Mac上为iOS手机部署iOS-Tagent之后&#xff0c;就可以使用AirtestIDE连接设备&#xff0c;像连接安卓设备一样&#xff0c;实时投影、控制手机。iOS测试不仅限于真机测试&#xff0c;iOS模拟器也可以进行。Mac端上部署完成后还可以提供给…

python-re模块

python之正则表达式-基础匹配https://blog.csdn.net/Python_1981/article/details/133777795python之正则表达式-元字符匹配https://blog.csdn.net/Python_1981/article/details/133778805 一、查找 1、findall 2、search 如果没有匹配到&#xff0c;会返回None, 使用group会报…

大文件传输小知识 | UDP和TCP哪个传输速度快?

在网络世界中&#xff0c;好像有两位“传输巨头”常常被提起&#xff1a;UDP和TCP。它们分别代表着用户数据报协议和传输控制协议。那么它们是什么&#xff1f;它们有什么区别&#xff1f;它们在传输大文件时的速度又如何&#xff1f;本文将深度解析这些问题&#xff0c;帮助企…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(简单支持发起人与审批人的流程)续

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 之前生产的xml&#xff0c;在bpmn设计里编辑有些内容不正确&#xff0c;包括审批人&#xff0c;关联表单等…

利用python找出偏序集中极大元、极小元、最大元和最小元

1 问题 在离散数学“关系”这一章的学习过程中&#xff0c;学到偏序集中极大元、极小元、最大元和最小元的求解方法&#xff0c;于是提出能不能用python语言实现偏序集中极大元、极小元、最大元和最小元的求解&#xff1f; 2 方法 判断偏序集中的极大元、极小元、最大元和最小元…

Java TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; impor…

Vue路由介绍及使用

一、单页应用程序介绍 1.概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现&#xff0c;当切换不同的功能时&#xff0c;页面不会进行刷新&#xff0c;类似Ajax请求&#xff0c;但请求地址会发生部分变化。 2.具体示例 单…

微型计算机原理1

一、选择题 1.8086CPU的字长是&#xff08;&#xff09;位。 A. 32 B. 128 C. 64 D. 16 2 间接寻址方式中&#xff0c;操作数在(&#xff09;中。 A. 通用寄存器 B. 内存单元 C. 程序计数器 D.堆栈 3.在循环指令LOOP和串操作指令中,用作计数器的寄存器是() A. AX B. BX C. C…

深度学习(CNN+RNN)笔记1

文章目录 视频课 第四课&#xff1a;卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第一周&#xff1a;Convolutional Neural Networks 卷积神经网络第二周&#xff1a;Case Studies 案例学习第三周&#xff1a;Object Detection 目标检测第四周&#xff…

Jupyter Notebook快速上手

Jupyter Notebook快速上手 文章目录 Jupyter Notebook快速上手1 运行Jupyter Notebook1.1 通过图形化界面打开1.2 通过命令行打开1.3 在指定项目目录下打开 2 Jupyter Notebook运行后无法自动打开网页3 Jupyter Notebook运行代码没反应4 退出4.1 终端退出4.2 命令行退出 此教程…

[PHP]ShopXO企业级B2C免费开源商城系统 v2.3.1

ShopXO 企业级B2C免费开源电商系统&#xff01; 求实进取、创新专注、自主研发、国内领先企业级B2C电商系统解决方案。 遵循Apache2开源协议发布&#xff0c;无需授权、可商用、可二次开发、满足99%的电商运营需求。 PCH5、支付宝小程序、微信小程序、百度小程序、头条&抖音…