java 通过Json -schema完成对数据的效验

news2024/11/23 18:44:17

Json -schema

  • 1.对象的效验
  • 2.数组套对象的效验
  • 3. 字符串的效验
    • 长度效验(minLength)(maxLength)
    • 正则效验
    • 日期和时间
  • 4.对象套对象效验
  • 5.对象套数组
  • 6. 其他参数
    • required(必须要填)
    • enum(范围之内)
    • not(不)
    • anyOf 和allOf(双方为真,有一个为真)
    • format

  • 参考文档
https://json-schema.org/understanding-json-schema/index.html

JSON Schema是什么?
根据JSON Schema 规范的定义,JSON模式是一种JSON媒体类型,用于定义JSON数据的结构。JSON模式旨在定义JSON数据的验证、文档、超链接导航和交互控制

  • 首先是添加pom

<!--        json格式效验测试-->
        <dependency>
            <groupId>com.github.everit-org.json-schema</groupId>
            <artifactId>org.everit.json.schema</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180130</version>
        </dependency>
  • 先从最简单的对象的校验开始先了解其他语法在进一步逐一渗透

1.对象的效验

  • 接口测试
  • 这里说一下粗略的流程
1. 首先需要有一个需要进行效验的实体类
2. 通过JSON.toJSONString将其转为实体类
3.  getClass().getResourceAsStream是获取到json的配置文件
4. 将其变为new org.json.JSONObjec对象类型的数据,
5. 将我们 上面转为json的实体类变为 new  JSONObjec
6. 通过schema.validate()去进行文件的效验,如果正确返回true,否则直接抛异常
7. 后面就是将异常翻译一下传给前端,让用户知道是哪个格式出错了


import com.alibaba.fastjson.JSON;
import com.bj.cy.Service.bradnApiService;
import com.bj.cy.enity.brand;
import com.bj.cy.utils.CheckAnalysisList;
import com.bj.cy.utils.CheckRowVo;
import com.bj.cy.utils.nety.test1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.everit.json.schema.ValidationException;
import org.everit.json.schema.loader.SchemaLoader;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;



    @ApiOperation("检测数据效验")
    @RequestMapping(value = "test2", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public Object test2(@RequestBody test1 test1) {
        //这个是你打算验证的JSON
        String userBehavioAudits = JSON.toJSONString(test1);
        //这个就是你设定的标准JSON
        InputStream inputStream = getClass().getResourceAsStream("/test.json");
        org.json.JSONObject Schema = new org.json.JSONObject(new JSONTokener(inputStream));
        org.everit.json.schema.Schema schema = SchemaLoader.load(Schema);
            try {
                JSONObject myJsonObject =  new  JSONObject(userBehavioAudits);
                schema.validate(myJsonObject);
            } catch (ValidationException e) {
                String errorMessage = e.getAllMessages().toString().replace("not found", "为空值!");
                String errorMessage1 = errorMessage.replace("is not a valid enum value", "不在枚举范围内!");
                String errorMessage2 = errorMessage1.replace("expected maxLength:", "字段最大长度为:");
                String errorMessage3 = errorMessage2.replace("actual:", "当前实际长度:");
                String errorMessage4 = errorMessage3.replace("is not less or equal to ", "最大范围为为:");
                String errorMessage5 = errorMessage4.replace("subject must not be valid against schema", "不可是以下枚举值");
                return  errorMessage5;
        }
        return "str";

    }

  • 实体类(test)
@Data
public class test1 {

    private String name;

    private  String sex;

    private String filename;
}
  • json效验文件
{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "http://example.com/example.json",
  "type": "object",
  "additionalProperties": true,
  "required": [
    "name",
    "sex",
    "filename"
  ],
  "properties": {
    "name": {
      "$id": "#/properties/name",
      "type": "string",
      "maxLength": 36,
      "minLength": 10,
      "not": {
        "enum": [
          "String",
          "string"
        ]
      }
    },
    "sex": {
      "$id": "#/properties/sex",
      "type": "string",
      "not": {
        "enum": [
          "String",
          "string"
        ]
      }
    },
    "filename": {
      "$id": "#/properties/filename",
      "type": "string",
      "not": {
        "enum": [
          "String",
          "string"
        ]
      }
    }
  }

}

在这里插入图片描述

在这里插入图片描述

2.数组套对象的效验

  • 数组套对象其实和上面的,没什么区别,for循环然后把错误信息add一下返回

    @ApiOperation("检测数据效验")
    @RequestMapping(value = "test3", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public Object test3(@RequestBody List<test1> test1) {

        List<String>errLis=new ArrayList<>();

        //这个是你打算验证的JSON
        String userBehavioAudits = JSON.toJSONString(test1);

        //因为是数组所以要转为Jsonarrat类型的
        JSONArray array = new JSONArray(userBehavioAudits);
        //这个就是你设定的标准JSON

        InputStream inputStream = getClass().getResourceAsStream("/test.json");
        org.json.JSONObject Schema = new org.json.JSONObject(new JSONTokener(inputStream));
        org.everit.json.schema.Schema schema = SchemaLoader.load(Schema);
        for (int i = 0; i < test1.size(); i++) {


        try {
             JSONObject jsonObject = array.getJSONObject(i);
//            JSONObject myJsonObject =  new  JSONObject(userBehavioAudits);
            schema.validate(jsonObject);
        } catch (ValidationException e) {
            String errorMessage = e.getAllMessages().toString().replace("not found", "为空值!");
            String errorMessage1 = errorMessage.replace("is not a valid enum value", "不在枚举范围内!");
            String errorMessage2 = errorMessage1.replace("expected maxLength:", "字段最大长度为:");
            String errorMessage3 = errorMessage2.replace("actual:", "当前实际长度:");
            String errorMessage4 = errorMessage3.replace("is not less or equal to ", "最大范围为为:");
            String errorMessage5 = errorMessage4.replace("subject must not be valid against schema", "不可是以下枚举值");
            errLis.add(errorMessage5);
        }
        }
        return errLis;

    }

3. 字符串的效验

长度效验(minLength)(maxLength)

  • 效验最大长度是36,最小长度是10,在这个范围之内为true反之为false
    在这里插入图片描述
    在这里插入图片描述

正则效验

  • 效验其是否是一个邮箱
    在这里插入图片描述

在这里插入图片描述

日期和时间

  • “date-time”:日期和时间在一起,例如。2018-11-13T20:20:39+00:00
    “time”:草案 7 时间中的新内容,例如,20:20:39+00:00
    “date”:草案 7 日期中的新增内容,例如,.2018-11-13
    “duration”:2019-09 年草案中的新增内容 ISO 定义的持续时间 8601 ABNF 表示“持续时间”。为 例如,表示持续时间为 3 天

在这里插入图片描述
在这里插入图片描述

4.对象套对象效验

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "http://example.com/example.json",
  "type": "object",
  "additionalProperties": true,
  "required": [
    "shoop",
    "wor"
  ],
  "properties": {
    "shoop": {
      "$id": "#/properties/name",
      "type": "string",
      "maxLength": 5
    },
    "wor": {
      "$id": "#/properties/sex",
      "type": "string",
      "maxLength": 5
    },
    "test": {
      "type": "object",     //这个是主要的因为对象的类型是object类型
              "properties": {      
                "name": {
                  "type": "string",
                  "maxLength": 5
                }
              }
    }
  }

}

在这里插入图片描述

@Data
public class test2 {
    private String shoop;

    private String wor;

    private test1 test;
}

@Data
public class test1 {

    private String name;

    private  String sex;

    private String filename;
}

5.对象套数组

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "http://example.com/example.json",
  "type": "object",
  "additionalProperties": true,
  "required": [
    "shoop",
    "wor"
  ],
  "properties": {
    "shoop": {
      "$id": "#/properties/name",
      "type": "string",
      "maxLength": 5
    },
    "wor": {
      "$id": "#/properties/sex",
      "type": "string",
      "maxLength": 5
    },
    "test": {
      "type": "array",    //表名其是个数组
      "items": {   //表示每一个元素
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 5
          }
        }
      }
    }
  }

}

在这里插入图片描述

@Data
public class test3 {

    private String shoop;

    private String wor;

    private List<test1> test;
}
@Data
public class test1 {

    private String name;

    private  String sex;

    private String filename;
}

6. 其他参数

required(必须要填)

在这里插入图片描述
在这里插入图片描述

enum(范围之内)

在这里插入图片描述

在这里插入图片描述

not(不)

  • 增加了not的枚举是只有等于里面的数才会出错
    在这里插入图片描述
    在这里插入图片描述

anyOf 和allOf(双方为真,有一个为真)

  • anyOf 是有一个为真就可以
  • 反之则放行
    在这里插入图片描述

format

  • format关键字允许对常用的某些类型的字符串值进行基本语义验证:

/** 
format 的可能取值:
    "date-time":日期和时间在一起,例如, 2018-11-13T20:20:39+00:00。
    "time":draft7的时间,例如,20:20:39+00:00
    "date":draft7的日期,例如,2018-11-13。
    "hostname": Internet 主机名
    "idn-hostname":国际化 Internet 主机名
    "ipv4":IPv4 地址
    "ipv6":IPv6 地址
    "uri":通用资源标识符 (URI) 。
    "uri-reference":一个 URI 引用(URI 或相对引用)
    "iri":“uri”的国际化等价物。
    "iri-reference":“uri-reference”的国际化等价物
    "uri-template":一个 URI 模板(任何级别)
    "json-pointer":一个 JSON 指针
    "relative-json-pointer":一个相对 JSON 指针。
    "regex":正则表达式。
*/
 
{ 
  "type": "string", 
  "format": "date-time" 

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

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

相关文章

C++之重写基类虚函数添加override区别(一百六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

5. MySQL - JDBC SQL 注入 博客系统(万字详解)

目录 1. 介绍 2. 使用 JDBC 连接数据库 2.1 如何使用 JDBC 连接数据库 2.2 导入的各个类 2.3 DataSource 对象的创建 2.4 从 DataSource 对象中得到 Connection 对象 2.5 创建 Statement 对象 2.6 从 ResultSet 中遍历每行结果&#xff0c;从每行中获取每列的值 2.7 代…

Django-linux主机计划任务查看服务

目录 需求 功能介绍 页面效果 代码编写 docker部署 需求 线上主机一百台左右&#xff0c;经常会在某个服务器上放置一些自动化脚本&#xff0c;并配置计划任务&#xff0c;时间长可能忘记计划任务所在服务器&#xff0c;所以开发一个用于收集展示crontab任务的服务 语言框…

Coremail易念:2022年企业邮件钓鱼模拟演练分析报告

以下为精华版阅读&#xff0c;如需下载完整版&#xff0c;关注【CACTER邮件安全】&#xff0c;后台回复关键词【钓鱼报告】即可免费下载。 Coremail&易念科技《2022年企业邮件钓鱼模拟演练分析报告》重磅发布&#xff01;有哪些精华亮点&#xff0c;点击下拉。 一、制造业钓…

opencv-07-感兴趣区域(ROI)

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区 域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 以下是一些 OpenCV ROI应用场景 …

【测试开发】自动化测试 selenium 篇

目录 一. 什么是自动化测试 二. selenium 1. selenium的工作原理 2. seleniumJava的环境搭建(Chrome浏览器) 三. selenium中常用的API 1. 定位元素 findElement 1.1 css选择语法 1.2 xpath 2. 操作测试对象 2.1 sendKeys-在对象上模拟按键输入 2.2 click-点击对象…

ECMAScript 6 之二

目录 2.6 Symbol 2.7 Map 和 Set 2.8 迭代器和生成器 2.9 Promise对象 2.10 Proxy对象 2.11 async的用法 2.22 类class 2.23 模块化实现 2.6 Symbol 原始数据类型&#xff0c;它表示是独一无二的值。它属于 JavaScript 语言的原生数据类型之一&#xff0c;其他数据类型…

本地前端项目使用gitee仓库外链图片加载失败

错误&#xff1a;本地的前端项目&#xff0c;比如vue&#xff0c;纯html使用<img/>标签加载gitee保存的图片文件的时候&#xff0c;浏览器加载失败。 但是gitee可以正常访问图片 解决办法&#xff1a; 在index.html中加入meta标签就可以完美解决 <meta name"r…

使用fastjson序列化后字段属性发生了变化

问题描述 使用 fastjson 进行 JSON 序列化存储到数据库后&#xff0c;发现 JSON 字符串“莫名其妙地”多了一些属性&#xff0c;也少了些属性。问题出现在基本类型的布尔类型以 is 开头的属性。 复现 1、定义对象 其中一个boolean类型的属性isActive以is开头&#xff0c;一个…

Linux内核模块开发 第 10 章 系统调用

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客&#xff08;WaterCutter&#xff09;源 LKMPG 10 系统调用 到目前为止&#xff0c;我们所做的唯一一件事就是使用定义明确的内核机制来注册…

webrtc源码阅读之视频RTP接收JitterBuffer

在音视频通信中&#xff0c;网络抖动和延迟是常见的问题&#xff0c;会导致音视频质量下降和用户体验不佳。为了解决这些问题&#xff0c;WebRTC引入了Jitter Buffer&#xff08;抖动缓冲区&#xff09;这一重要组件。Jitter Buffer是一个缓冲区&#xff0c;用于接收和处理网络…

HTML文件概述

HTML是标准的ASCII文件&#xff0c;其后缀是.html。其由两部分部分组成。包扩声明文档&#xff0c;和HTML内容部分。其中HTML内容部分又由头标签,身体标签&#xff0c;和脚标签三部分组成。 那么我们完整的网页由HTML&#xff0c;CSS,Javascirpy三部分组成。 我们说HTML标签就相…

接口自动化测试框架开发 (pytest+allure+aiohttp+ 用例自动生成)

目录 前言&#xff1a; 第一部分&#xff08;整个过程都要求是异步非阻塞的&#xff09; 读取 yaml 测试用例 http 请求测试接口 收集测试数据 第二部分 动态生成 pytest 认可的测试用例 后续&#xff08;yml 测试文件自动生成&#xff09; 前言&#xff1a; 开发一个…

“Layui用户认证:实现安全高效的登录和注册体验”

目录 1.什么是layui2.layui、easyui与bootstrap的对比3.layui入门4.构建登录页面5.构建注册页面6.总结 1.什么是layui layui&#xff08;谐音&#xff1a;类 UI) 是一套开源的 Web UI 解决方案&#xff0c;采用自身经典的模块化规范&#xff0c;并遵循原生 HTML/CSS/JS 的开发…

历史邮件数据究竟该走向何方.....

市场背景 随着企业的快速发展&#xff0c;邮件系统的数据量也随之增加。陈年累月的邮件数据更是记录着企业诸多重要的交易信息记录。电子邮件可以作为法律证据支持诉讼 邮件保存已经成为关系到诉讼成败的关键一环 数据归档来源 由美国参议员Sarbanes和美国众议员Oxley联合提出…

YOLOv7 yaml 文件简化

文章目录 修改方式common.pyyolo.pyYOLOv7-ELAN.yaml原始的 YOLOv7 yaml 文件的模块是拆开写的,比较乱, 改进起来也不太容易,这篇博文将 YOLOv7 yaml 文件换了一种写法, 参数量和计算量是完全和原来一致的,区别只是在于 yaml文件的写法不同, 封装后具体的结构可以参考…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 一)

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#xff0c;建议开发者具备TS语…

TJUACM假期集训个人赛(九)(cf1453a-d cf1440a-c)

今天最后一场个人赛 出题玩抽象的 密码是 l a s t d a n c e lastdance lastdance 然后题名连起来是个人赛的最后一舞 最抽象的我觉得还是一套题出三道大模拟&#xff0c;人写没了 寻思最后一场好好打拿个 r k 1 rk1 rk1&#xff0c;最后十分钟被超了&#xff0c;三周个人赛没…

【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路(回归改分类)

【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路&#xff08;回归改分类&#xff09; 针对单输入多输出分类预测&#xff0c;可采用回归的方式进行预测。 本文采用BP神经网络进行演示。 一、导入数据 数据为1输入&#xff0c;5输出&#…

短视频矩阵系统源码--开发实践

短视频矩阵系统源码开发技术&#xff1a; 1. 数据采集&#xff1a;使用Python的requests库进行数据爬取&#xff0c;使用Selenium模拟浏览器操作&#xff0c;解决抖音反爬虫机制。 2. 数据处理&#xff1a;使用Python的正则表达式、BeautifulSoup等库进行数据处理。 3. 关键…