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

news/2025/3/13 13:33:59/文章来源:https://www.cnblogs.com/didispace/p/18344858

JSON是我们编写API时候用于数据传递的常用格式,那么你是否知道JSON Schema呢?

在数据交换领域,JSON Schema 以其强大的标准化能力,为定义和规范 JSON 数据的结构与规则提供了有力支持。通过一系列精心设计的关键字,JSON Schema 能够详尽地描述数据的各项属性。然而,仅凭 JSON Schema 本身,尚不足以验证 JSON 实例是否严格遵循预设的模式。此时,JSON Schema 验证器的角色便显得尤为关键。这些验证器如同严格的检查官,确保每一个 JSON 文档都能忠实地反映出模式的定义。JSON Schema 验证器,作为实现 JSON Schema 规范的技术工具,其灵活的集成能力使得无论项目规模大小,都能轻松地将 JSON Schema 融入开发流程,从而提升数据处理的效率与准确性。

下面我们来看看如何在Spring Boot应用中使用JSON Schema校验JSON数据

动手试试

  1. 创建一个基本的Spring Boot应用,如果还不会可以点击查看快速入门

  2. pom.xml中添加json-schema-validator依赖

<dependency><groupId>com.networknt</groupId><artifactId>json-schema-validator</artifactId><version>1.4.0</version>
</dependency>
  1. 创建JSON Schema

src/main/resources目录下创建一个validation.json文件,然后在里面制定一套详尽的验证规则,比如下面这样:

{"$schema": "http://json-schema.org/draft-07/schema#","title": "Order Event","description": "Order event schema for example","required": ["order_id", "total_price", "products" ],"properties": {"order_id": {"type": "string"},"event": {"enum": ["PLACED", "DELIVERED", "RETURNED"],"type": "string"},"total_price": { "type": "number","minimum": 0},"products": {"type": "array","items": {"additionalProperties": true,"required": ["product_id", "price"],"minItems": 1,"properties": {"product_id": {"type": "string"},"price": {"type": "number","minimum": 0},"quantity": {"type": "integer"}}}}}
}
  1. 创建 JsonSchema 的 Bean

当然,你也可以直接new来创建,但实战中还是推荐用Spring管理这些实例,比如 下面这样:

@Configuration
public class JsonSchemaConfiguration {private static final String SCHEMA_VALIDATION_FILE = "validation.json";@Beanpublic JsonSchema jsonSchema() {return JsonSchemaFactory.getInstance( SpecVersion.VersionFlag.V7 ).getSchema( getClass().getResourceAsStream( SCHEMA_VALIDATION_FILE ) );}
}
  1. 使用 JsonSchema
@Slf4j
@Service
public class JsonSchemaValidationService{@Autowiredprivate JsonSchema jsonSchema;public String validateJson(JsonNode jsonNode){Set<ValidationMessage> errors = jsonSchema.validate(jsonNode);if(errors.isEmpty()){log.info("event is valid");}else{log.info("event is invalid");}return errors.toString();}
}
  1. 在 Web 层的应用

创建一个Controller,当接收到来自客户端的JSON数据之后,就可以像下面这样对json数据进行校验:

import com.fasterxml.jackson.databind.JsonNode;
@RestController
public class JsonSchemaController {@Autowiredprivate JsonSchemaValidationService service;@PostMapping("/test")public String validateEvent( @RequestBody JsonNode jsonNode ){return service.validateJson(jsonNode);}
}
  1. 测试一下

启动 Sprint Boot 应用,然后使用你喜欢的http客户端工具对/test接口发送测试请求:

比如,下面使用Curl来进行测试:

  • 符合规则的合法请求:

$ curl --location 'localhost:8080/test' \
--header 'Content-Type: application/json' \
--data '{"order_id":"order134","event": "PLACED","products": [{"product_id": "product_1","price":20.5,"quantity":2}],"total_price": 41
}'

校验通过,返回:[],没有错误信息

  • 不符合规则的非法请求(却少order id):
$ curl --location 'localhost:8080/test' \
--header 'Content-Type: application/json' \
--data '{"event": "PLACED","products": [{"product_id": "product_1","price":20.5,"quantity":2}],"total_price": 41
}'

校验失败,将返回错误信息:[$.order_id: is missing but it is required]

好了,今天的分享就到这里,希望对您有用。如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

相关资料

  • What is JSON Schema?
  • JSON Schema validator

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装oracle19c

1. 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c2. 创建目录并赋权 mkdir -p /docker/oracle19c/oradatachmod 777 /docker/oracle19c/oradata 3. 构建容器并启动 docker run -d -p 1521:1521 \ -p 5502:5500 \ -e ORACLE_SID=ORCLCDB \ -e…

便捷地发get或者post请求的方法

import org.springframework.http.HttpMethod;import org.springframework.web.client.RestTemplate;

易基因:哺乳动物胎盘DNA甲基化变化和胎儿出生体重的综合分析 | 科研速递

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 出生体重是一个复杂的多因素性状,与后期生活中的健康状况和疾病风险有关。胎盘对胎儿的正常生长至关重要,并负责促进母体和发育中胎儿之间的气体、营养和废物交换。胎盘DNA甲基化变化如何影响胎儿出生体重尚…

高性能USB转串口适配器,让USB和串行接口轻松实现双向通信!

多功能数字接口转发器,让USB和串行接口轻松实现双向通信!高性能USB转串口适配器,助力你的嵌入式程序开发!USB转串口适配器可编程开发板TYPE接口是一种多功能的数字接口物理层协议转发器,可以转换USB接口和串行接口之间的双向通信。它支持多种嵌入式程序开发,并可以自由制…

医院信息管理系统(慢病管理)

基于若依前后端分离版基础框架实现的医院患者信息管理系统(慢病管理),主要包含系统管理,科室配置,用户配置,患者配置,药品进销存,看病就诊,收费管理,患者就诊问询,数据统计,慢病管理,医生每日待办等核心模块医院慢病管理系统简介: 基于若依前后端分离版基础框架实…

PuerTS和HybridCLR哪个更适合开发微信小游戏

1)PuerTS和HybridCLR哪个更适合开发微信小游戏2)使用了Play Asset Delivery提交版本被Google报错3)怎样设置normalize来改变摄像机位置4)如何禁用增强型输入法中除某些输入操作之外的输入操作这是第397篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社…

vue 父子组件传值报错:this.$emit is not a function 解决

报错基本上都是因为this指向问题,基本上就是 function 和 () => 之间的问题,进行这俩的替换基本上都可以解决。我碰到了此问题,因为this指向了方法,而不是vue 改成箭头函数,解决

.NET 开源权限认证项目 MiniAuth上线

前言 在Web应用项目中权限认证是个绕不开的话题,传统方法复杂又耗时。MiniAuth推出专为.NET开发者设计的简单、实用的权限认证项目。 MiniAuth,作为ASP.NET Core的插件,让我们快速轻松实现用户登录、权限检查等功能。它支持多种认证方式,如JWT、Cookie,且易于集成到现有项…

(已解决)QT4 自定义信号函数调用报错 error: C2248: “Boss::DeadSignal”: 无法访问 protected 成员(在“Boss”类中声明)

(解决方法见文章末尾) 报错语句如下 DeadSignal是自定义槽函数,是放在public下的,不知道为什么报错说是protected,不知道是不是版本问题 Boss类和DeadSignal定义如下 mboss是在自定义类Widget中调用的Boss对象 调用位置是Widget的自定义槽函数 解决方法 在Boss中定义一…

使用rewriteBatchedStatements属性优化Mybatis-Plus批量插入数据(转)

原文:https://blog.csdn.net/mcband/article/details/131530297 前言由于项目是使用MyBatis-Plus开发的,用起来也确实比较方便,尤其是service层封装好的一些通用的增删改查方法,省去了不少sql语句的书写,但是在开发过程中,我也发现MyBatis-Plus的saveBatch批量插入方法针…

CSS中span元素垂直居中【解决span元素内基线对齐问题】

CSS中span元素垂直居中【解决span元素内基线对齐问题】 在样式的书写中,我们常常使用以下方式实现垂直居中,若span元素内例外,解决办法看文章最后 <div class="parent"><span class="child">text</span> </div>1.flex布局方式垂…

【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks

问题现象 客户将一个100G的表的数据插入到另一个表中,使用insert into select插入数据。从第一天下午2点开始执行,到第二天上午10点,一直未执行完毕。 由于需要实施下一步操作,客户kill重启了数据库,之后数据库一直回滚中,导致后续执行其他操作都报错YAS-02016 no free u…