当前位置: 首页 > news >正文

Spring Boot 中使用 JSON Schema 来校验复杂 JSON 数据

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


在现代软件开发中,尤其是构建 RESTful API 时,处理 JSON 数据已成为一项基本任务。JSON(JavaScript Object Notation)因其轻量级和易于人类阅读的特点,成为了数据交换的流行格式。然而,随着应用程序的复杂性增加,验证 JSON 数据以确保其符合预期的格式和结构变得至关重要。在 Spring Boot 应用中,JSON Schema 提供了一种强大且灵活的方式来校验复杂的 JSON 数据。

一、JSON Schema 简介

JSON Schema 是一种基于 JSON 的声明性规范,用于描述 JSON 数据的结构。它允许开发者定义 JSON 数据的类型、格式、必填字段、约束条件等。通过使用 JSON Schema,我们可以确保接收到的 JSON 数据符合预期的结构和格式,从而提高数据的质量和可靠性。

二、在 Spring Boot 中使用 JSON Schema

要在 Spring Boot 应用中使用 JSON Schema 来校验 JSON 数据,我们需要以下几个步骤:

1. 引入依赖

首先,我们需要在 pom.xml 文件中添加必要的依赖。通常,我们会使用 json-schema-validator 库来进行 JSON Schema 的校验。以下是一个示例依赖配置:

<dependency>  <groupId>com.github.fge</groupId>  <artifactId>json-schema-validator</artifactId>  <version>2.2.14</version>  
</dependency>

注意:在实际使用中,请确保使用最新版本的库。

2. 定义 JSON Schema

接下来,我们需要定义一个 JSON Schema 文件来描述我们期望的 JSON 数据结构。以下是一个简单的 JSON Schema 示例,用于校验一个包含用户名和密码的 JSON 对象:

{  "$schema": "http://json-schema.org/draft-07/schema#",  "type": "object",  "properties": {  "username": {  "type": "string",  "minLength": 5,  "maxLength": 20  },  "password": {  "type": "string",  "minLength": 8,  "maxLength": 20,  "pattern": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$"  }  },  "required": ["username", "password"],  "additionalProperties": false  
}

在这个示例中,我们定义了一个包含 username 和 password 字段的 JSON 对象,并设置了相应的类型和约束条件。

3. 编写校验逻辑

在 Spring Boot 应用中,我们可以编写一个服务类来处理 JSON Schema 的校验逻辑。以下是一个示例服务类:

import com.fasterxml.jackson.databind.JsonNode;  
import com.fasterxml.jackson.databind.ObjectMapper;  
import com.github.fge.jsonschema.core.exceptions.ProcessingException;  
import com.github.fge.jsonschema.main.JsonSchema;  
import com.github.fge.jsonschema.main.JsonSchemaFactory;  
import com.github.fge.jsonschema.report.ProcessingReport;  
import org.springframework.beans.factory.annotation.Value;  
import org.springframework.core.io.ClassPathResource;  
import org.springframework.core.io.Resource;  
import org.springframework.stereotype.Service;  import java.io.IOException;  
import java.nio.charset.StandardCharsets;  
import java.nio.file.Files;  
import java.nio.file.Paths;  @Service  
public class JsonSchemaValidatorService {  private final JsonSchema schema;  public JsonSchemaValidatorService(@Value("${json.schema.location}") String schemaLocation) throws IOException, ProcessingException {  Resource resource = new ClassPathResource(schemaLocation);  String schemaJson = new String(Files.readAllBytes(Paths.get(resource.getURI())), StandardCharsets.UTF_8);  JsonSchemaFactory factory = JsonSchemaFactory.byDefault();  this.schema = factory.get().parse(schemaJson);  }  public boolean validate(JsonNode jsonNode) {  ProcessingReport report = schema.validate(jsonNode);  return report.isSuccess();  }  
}

在这个示例中,我们通过读取类路径下的 JSON Schema 文件来创建 JsonSchema 对象,并提供了一个 validate 方法来校验传入的 JsonNode 对象是否符合 JSON Schema。

4. 在控制器中使用校验服务

最后,我们可以在控制器中使用这个校验服务来校验接收到的 JSON 数据。以下是一个示例控制器:

import com.fasterxml.jackson.databind.JsonNode;  
import com.fasterxml.jackson.databind.ObjectMapper;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.http.HttpStatus;  
import org.springframework.http.ResponseEntity;  
import org.springframework.web.bind.annotation.*;  @RestController  
@RequestMapping("/api")  
public class UserController {  @Autowired  private JsonSchemaValidatorService jsonSchemaValidatorService;  @PostMapping("/users")  public ResponseEntity<String> createUser(@RequestBody String jsonData) {  ObjectMapper objectMapper = new ObjectMapper();  try {  JsonNode jsonNode = objectMapper.readTree(jsonData);  if (jsonSchemaValidatorService.validate(jsonNode)) {  // 处理有效的 JSON 数据  return ResponseEntity.ok("User created successfully");  } else {  return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid JSON data");  }  } catch (IOException e) {  return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Error parsing JSON data");  }  }  
}

在这个示例中,我们创建了一个 UserController,其中包含一个 createUser 方法来处理 POST 请求。该方法接收一个 JSON 字符串作为请求体,并使用 ObjectMapper 将其解析为 JsonNode 对象。然后,它调用 JsonSchemaValidatorService 的 validate 方法来校验 JSON 数据。如果校验成功,则处理有效的 JSON 数据;如果校验失败,则返回 BAD_REQUEST 状态码和错误信息。

三、总结

通过在 Spring Boot 应用中使用 JSON Schema,我们可以轻松地校验复杂的 JSON 数据,确保其符合预期的结构和格式。这不仅提高了数据的质量和可靠性,还减少了因数据格式错误而导致的错误和异常。此外,JSON Schema 的声明性特性使得它易于理解和维护,为开发人员提供了一种强大且灵活的工具来管理 JSON 数据。

相关文章:

Spring Boot 中使用 JSON Schema 来校验复杂 JSON 数据

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代软件开发中&#xff0c;尤其是构建 RESTful API 时&#xff0c;处理 JSON 数据已成为一项基本任务。JSON&#xff08;JavaScript Object Notation&#xff09;因其轻量级和易于人类阅读的特点&#xff…...

QT实现Opencv图像处理

案例 基于QT的人脸识别 pro文件需要加以下代码 INCLUDEPATH E:/opencv/opencv3.4-qt-intall/install/include INCLUDEPATH E:/opencv/opencv3.4-qt-intall/install/include/opencv INCLUDEPATH E:/opencv/opencv3.4-qt-intall/install/include/opencv2 LIBS E:/opencv/o…...

刚转Mac的新手如何卸载不需要的应用程序

最开始转Mac系统的时候很是苦恼&#xff0c;到底该怎么卸载App啊&#xff0c;App直接拖到废纸篓真的能卸载干净吗&#xff0c;卸载App时会不会留下一些文件残留&#xff0c;慢慢的会不会占满内存&#xff0c;于是我找到了一个免费的卸载工具——XApp。 这是一款Mac应用程序卸载…...

Unity 3d 继承MonoBahaviour的单例

在使用Unity3d开发游戏或做客户端项目时&#xff0c;单例是最常见的模式之一&#xff0c;他简单了类的创建&#xff0c;在代码中可以直接调用。下面是两个例子&#xff0c;代码两种不同类型的单例&#xff0c;一个是基本类的单例基类&#xff0c;不是unity MonoBehaviour的类都…...

grafana version 11.1.0 设置Y轴刻度为1

grafana 版本 # /usr/share/grafana/bin/grafana --version grafana version 11.1.0设置轴 Axis 搜索 Standard options 在"Decimals"中输入0&#xff0c;确保只显示整数...

Elasticsearch的安装与配置

注意&#xff1a;elasticsearch 禁止安装在/root路径下&#xff01; 1、创建用户组 groupadd elastic 2、创建用户 useradd es -d /home/es -g elastic echo es | passwd es --stdin 3、给新创建的用户进行授权 chown -R es:elastic /home/es chmod -R 775 /home/es 4…...

win0删除 Windows.old

参考&#xff1a;https://blog.csdn.net/xitongzhijia_abc/article/details/126270452 win10如下所示&#xff1a; 打开 设置–>系统—>存储...

常见IDE及其编译器的讲解

IDE 意思是&#xff1a;集成开发环境 常见的IDE有哪些&#xff1f; eg. devC,VS2022,xcode,codeblocks,clion常见编译器有哪些&#xff1f; eg.msvc,gcc,clang微软的底层编译器是msvc苹果的底层编译器是clang IDE编译器特点devC集成了gcc小巧&#xff0c;工具简单&…...

用SQLyog连接mysql提示2058错误

1)在cmd下(必须是这个,不能是gitbash) // step1:修改下数据库 C:\Users\elex>mysql -uroot -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 97 Server version: 8.1.0 MySQL Community Server - GPLCopy…...

Web集群服务-Nginx

1. web服务 1. WEB服务:网站服务,部署并启动了这个服务,你就可以搭建一个网站 2. WEB中间件: 等同于WEB服务 3. 中间件:范围更加广泛,指的负载均衡之后的服务 4. 数据库中间件:数据库缓存,消息对列 2. 极速上手指南 nginx官网: nginx documentation 2.1 配置yum源 vim /etc/…...

获取时隔半个钟的三天

摘要&#xff1a; 今天遇到需求是配送时间&#xff0c;时隔半个钟的排线&#xff01;所以需要拼接时间&#xff01;例如2024-10-08 14&#xff1a;30&#xff0c;2024-10-08 15&#xff1a;00&#xff0c;2024-10-08 15&#xff1a;30 <el-form-item label"配送时间&a…...

构建可以ssh连接的容器镜像

构建可以ssh连接的容器镜像 构建可以通过ssh进行连接容器镜像&#xff0c;实现远程登录容器的目的。 ubuntu ssh容器镜像 你可以使用以下Dockerfile来构建一个可以SSH的容器镜像&#xff1a; FROM ubuntu:20.04MAINTAINER lldhsds# 配置apt国内源 COPY sources.list /etc/a…...

数据库中JOIN的用法?

在数据库中&#xff0c;JOIN 操作用于结合来自两个或多个表的数据&#xff0c;基于它们之间的相关列。JOIN 是关系数据库查询中一个非常重要的功能&#xff0c;允许你从多个表中提取相关的数据。以下是几种常见的 JOIN 类型及其用法&#xff1a; INNER JOIN: 返回两个表中匹配的…...

java项目之纺织品企业财务管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的纺织品企业财务管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于spring boot…...

C语言 编程练习:解决五个有趣的问题

文章目录 编程练习&#xff1a;解决五个有趣的问题1. 出租车费用计算器1. 1 代码code 2. 成绩转换统计2. 1 代码code 3. 交错序列求和3. 1 代码code 4. 阶乘序列求和4. 1 代码code 5. 输出星号图案5. 1 代码code 编程练习&#xff1a;解决五个有趣的问题 在编程的世界里&#…...

二、安装vmtools

1、 介绍 vmtools 安装后&#xff0c;可以让我们在 windows 下更好的管理 vm 虚拟机。可以设置 windows 和 centos 的共享文件夹 当时当我们发现安装虚拟机工具位置是灰色的 右击打开终端 在终端输入命令 yum list installed | grep open-vm-*yum list installed 命令会列出…...

用echarts画天气预报

如图 上代码 <template><div id"temp15day"></div> </template><script setup> import * as echarts from "echarts"; const initChart () > {const machart echarts.init(document.getElementById("temp15day&q…...

如果要存IP地址,用什么数据类型比较好?(java)

存储IP地址需要考虑到IPv4和IPv6的不同特点&#xff0c;以及系统的需求。我们可以从字符串、整数和二进制三种常用方式来讨论如何高效存储和处理IP地址。 1. IPv4存储 1.1 字符串存储 优点&#xff1a;直观易读&#xff0c;简单易用。缺点&#xff1a;占用更多的存储空间&am…...

LinkedList源码解读

这里写目录标题 简介源码解读基础变量构造函数LinkedList()LinkedList(Collection<? extends E> c) 总结 简介 LinkedList 是对 Java 集合框架中 List 接口的一种具体实现&#xff0c;归属于线性数据结构的范畴。其核心内部结构是通过双向链表&#xff08;double-linke…...

springboot feign-httpclient 连接池配置

在默认情况下 spring cloud feign 在进行各个子服务之间的调用时&#xff0c;http组件使用的是jdk的HttpURLConnection&#xff0c;没有使用线程池。有2种可选的线程池&#xff1a;HttpClient 和 OKHttp 在Spring Boot项目中使用Feign并配置HttpClient连接池&#xff0c;你需要…...

5分钟掌握MAA:解放双手的明日方舟智能助手终极指南

5分钟掌握MAA&#xff1a;解放双手的明日方舟智能助手终极指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcod…...

i.MX6Q烧录翻车实录:从‘No Device Connected’到‘Push error’,我拔掉一个USB WiFi才搞定

i.MX6Q烧录实战&#xff1a;当USB设备冲突遇上OTG接口的排查指南 那天下午的阳光透过窗户斜射进实验室&#xff0c;我正对着i.MX6Q开发板进行例行固件更新。Mfgtools工具已经准备就绪&#xff0c;开发板电源接通&#xff0c;一切看起来都很完美——直到屏幕上跳出那个令人沮丧…...

从EfficientNetV1到V2:我是如何用PyTorch复现Fused-MBConv模块并验证其速度优势的

从EfficientNetV1到V2&#xff1a;我是如何用PyTorch复现Fused-MBConv模块并验证其速度优势的 去年在优化移动端图像分类模型时&#xff0c;我偶然发现EfficientNetV2论文中提到的Fused-MBConv模块在浅层网络中的推理速度比传统MBConv快30%以上。这个数字让我既兴奋又怀疑——毕…...

RoboMaster新手必看:CAN通讯驱动GM6020电机,从ID配置到线序接法的保姆级避坑指南

RoboMaster新手必看&#xff1a;CAN通讯驱动GM6020电机&#xff0c;从ID配置到线序接法的保姆级避坑指南 第一次接触RoboMaster比赛的新手们&#xff0c;面对CAN总线驱动GM6020这类电调电机一体式设备时&#xff0c;常常会遇到"明明发送了CAN包但电机就是不转"的困扰…...

从MySQL DBA转型ES:我的踩坑笔记与核心概念对比(Mapping/查询/索引篇)

从MySQL DBA转型ES&#xff1a;我的踩坑笔记与核心概念对比&#xff08;Mapping/查询/索引篇&#xff09; 当第一次接触Elasticsearch时&#xff0c;我习惯性地用MySQL的思维去理解它——结果可想而知。作为从业十年的MySQL DBA&#xff0c;转型过程中踩过的坑让我意识到&#…...

Kubernetes 网络与服务发现:从原理到实战避坑指南

摘要K8s 网络是很多人眼中的"黑盒"。本文深入剖析 Pod 通信、Service 发现、Ingress 网关的核心原理&#xff0c;结合真实生产环境的踩坑经验&#xff0c;带你彻底搞懂 K8s 网络模型。看完这篇&#xff0c;你再也不会被"服务找不到"、"跨节点通信失败…...

27考研er必备的那些学习工具!

对2027考研人来说&#xff0c;备考不是简单地“埋头刷题”&#xff0c;而是一场关于信息筛选、资源整合、时间管理和学习效率的长期战役。面对公共课、专业课、院校信息、经验帖、课程资源等海量内容&#xff0c;选对工具往往能让复习少走弯路。 以下这些平台和网站&#xff0c…...

ArcGIS老用户看过来:手把手教你为ArcMap 10.x定制专属Word报告插件(基于AddIN开发)

ArcGIS老用户进阶指南&#xff1a;打造智能Word报告生成插件 在GIS行业深耕多年的专业人士都清楚&#xff0c;ArcMap 10.x系列依然是许多企业和机构的核心生产力工具。尽管Esri已经将重心转向ArcGIS Pro&#xff0c;但大量历史项目、定制化工作流和团队使用习惯使得ArcMap仍然活…...

从LED闪烁到任务调度:手把手教你用英飞凌AURIX的STM系统定时器构建简单时间片

从LED闪烁到任务调度&#xff1a;基于英飞凌AURIX的STM系统定时器构建轻量级时间片框架 在嵌入式开发中&#xff0c;系统定时器&#xff08;STM&#xff09;常被简化为"高级延时工具"&#xff0c;但它的潜力远不止于此。当开发者面对需要同时处理LED状态控制、按键扫…...

基于QT5的串口上位机开发:从零实现数据收发与可视化

1. 项目概述&#xff1a;为什么我们需要自己动手写串口上位机&#xff1f;在嵌入式开发、工业控制、物联网设备调试这些领域&#xff0c;串口通信就像设备与电脑之间最古老也最可靠的“方言”。你可能用过各种现成的串口调试助手&#xff0c;它们功能强大&#xff0c;但当你需要…...