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

实战级SQL注入测试技巧揭秘

目录 一、高阶注入判断技巧&#xff08;不爆数据&#xff0c;只测漏洞&#xff09; 1. 布尔盲注&#xff08;Boolean-based&#xff09; 2. 时间盲注&#xff08;Time-based&#xff09; 3. 报错注入&#xff08;Error-based&#xff09; 二、高阶利用手法&#xff08;实战…...

英飞凌Aurix2G TC3XX 中断路由与DMA联动实战解析

1. 中断与DMA联动的核心价值 第一次接触英飞凌Aurix2G TC3XX的中断路由功能时&#xff0c;我像发现新大陆一样兴奋。传统嵌入式开发中&#xff0c;ADC采样完成→CPU读取数据→存入内存的流程就像用勺子一勺一勺地运水&#xff0c;而中断触发DMA的机制则像接上了自来水管——数据…...

逆流而上,逐光而行:光伏微逆的技术探索之路

交错反激光伏并网微逆&#xff1a;软件源程序硬件资料详细设计说明文档 产品介绍&#xff1a; 本项目用于单相光伏并网微型逆变器。 前级采用交错反激拓扑生成馒头波&#xff0c;后级采用SCR拓扑反向得到正弦波&#xff0c;带有&#xff1a;MPPT、锁相环、孤岛检测。 本项目支持…...

脑波货币化:公司用我的焦虑情绪炒期货

一、软件测试工程师&#xff1a;焦虑的“完美生产者”在持续集成、敏捷交付的现代开发流程中&#xff0c;软件测试从业者长期处于多重压力夹击之下&#xff1a;精确性高压&#xff1a;对缺陷零容忍的行业标准&#xff0c;使每一次测试执行如同走钢丝技术迭代焦虑&#xff1a;AI…...

英雄联盟LCU工具集:3大核心功能如何提升你的游戏体验?

英雄联盟LCU工具集&#xff1a;3大核心功能如何提升你的游戏体验&#xff1f; 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit Lea…...

别再为长文档发愁了!用DeepSeek-OCR + 单块A100,5步搞定古籍/财报批量识别

单块A100实战指南&#xff1a;用DeepSeek-OCR高效处理古籍与财报的5个关键步骤 当某省级图书馆需要数字化10万页明清古籍时&#xff0c;技术团队发现传统OCR方案需要3个月才能完成&#xff0c;而采用DeepSeek-OCR配合单块A100的方案&#xff0c;仅用11天就交付了准确率92%的数…...

大数据治理必看:数据目录的五大核心功能

大数据治理必看&#xff1a;数据目录的五大核心功能关键词&#xff1a;大数据治理、数据目录、元数据管理、数据血缘、数据协作摘要&#xff1a;在数据量爆炸式增长的今天&#xff0c;企业常面临“数据多到找不到、找到不敢用、用了怕出错”的困境。数据目录作为大数据治理的“…...

【day63】

以前有个孩子&#xff0c;他分分钟都在碎碎念。不过&#xff0c;他的念头之间是有因果关系的。他会在本子里记录每一个念头&#xff0c;并用箭头画出这个念头的来源于之前的哪一个念头。翻开这个本子&#xff0c;你一定会被互相穿梭的箭头给搅晕&#xff0c;现在他希望你用程序…...

nli-distilroberta-base详细步骤:自定义sentence-pair输入格式与JSON Schema定义

nli-distilroberta-base详细步骤&#xff1a;自定义sentence-pair输入格式与JSON Schema定义 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)Web服务&#xff0c;专门用于分析句子对之间的逻辑关系。这个轻量级模型能够快速判断两个句子之间…...

Android蓝牙HFP连接实战:从SDK调用到底层状态机全解析(附避坑指南)

Android蓝牙HFP连接实战&#xff1a;从SDK调用到底层状态机全解析&#xff08;附避坑指南&#xff09; 在移动设备互联场景中&#xff0c;蓝牙免提协议&#xff08;HFP&#xff09;作为语音通话的核心传输通道&#xff0c;其连接稳定性直接影响用户体验。本文将深入Android蓝牙…...