当前位置: 首页 > 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;你需要…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...