首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月06日 10:46

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";
   
    @Bean
    public JsonSchema jsonSchema() {
        return JsonSchemaFactory
                .getInstance( SpecVersion.VersionFlag.V7 )
                .getSchema( getClass().getResourceAsStream( SCHEMA_VALIDATION_FILE ) );
    }
}
  1. 使用 JsonSchema
@Slf4j
@Service
public class JsonSchemaValidationService{
  
  @Autowired
  private 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 {
    @Autowired
    private 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教程可以点击直达!,欢迎收藏与转发支持!

相关资料

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

From:https://www.cnblogs.com/didispace/p/18344858
本文地址: http://shuzixingkong.net/article/834
0评论
提交 加载更多评论
其他文章 ComfyUI插件:efficiency-nodes-comfyui节点
前言: 学习ComfyUI是一场持久战, efficiency-nodes-comfyui是提高工作流创造效率的工具,包含效率节点整合工作流中的基础功能,比如Efficient Loader节点相当于Load Checkpoint+Clip set layer+Load VAE等等的合集,并且该插件
ComfyUI插件:efficiency-nodes-comfyui节点 ComfyUI插件:efficiency-nodes-comfyui节点 ComfyUI插件:efficiency-nodes-comfyui节点
神秘 Arco 样式出现,祭出 Webpack 解决预期外的引用问题
神秘 Arco 样式出现,祭出 Webpack 解决预期外的引用问题 Webpack是现代化的静态资源模块化管理和打包工具,其能够通过插件配置处理和打包多种文件格式,生成优化后的静态资源,核心原理是将各种资源文件视为模块,通过配置文件定义模块间的依赖关系和处理规则,从而实现模块化开发。Webpack
简单设计一个JAVA并行处理工具类
本文介绍了几种常见的并行处理业务数据的写法以及基于CompletableFuture逐步封装更易于使用、可读性更好的工具类
.NET 开源权限认证项目 MiniAuth上线
前言 在Web应用项目中权限认证是个绕不开的话题,传统方法复杂又耗时。MiniAuth推出专为.NET开发者设计的简单、实用的权限认证项目。 MiniAuth,作为ASP.NET Core的插件,让我们快速轻松实现用户登录、权限检查等功能。它支持多种认证方式,如JWT、Cookie,且易于集成到现有
.NET 开源权限认证项目 MiniAuth上线 .NET 开源权限认证项目 MiniAuth上线 .NET 开源权限认证项目 MiniAuth上线
深度解读KubeEdge架构设计与边缘AI实践探索
摘要:解读业界首个云原生边缘计算框架KubeEdge的架构设计,如何实现边云协同AI,将AI能力无缝下沉至边缘,让AI赋能边侧各行各业,构建智能、高效、自治的边缘计算新时代,共同探索智能边缘的新篇章。 本文分享自华为云社区《DTSE Tech Talk | 第63期:KubeEdge架构设计与边缘A
深度解读KubeEdge架构设计与边缘AI实践探索 深度解读KubeEdge架构设计与边缘AI实践探索 深度解读KubeEdge架构设计与边缘AI实践探索
部署CPU与GPU通用的tensorflow:Anaconda环境
本文介绍在Anaconda环境中,下载并配置Python中机器学习、深度学习常用的新版tensorflow库的方法~
部署CPU与GPU通用的tensorflow:Anaconda环境 部署CPU与GPU通用的tensorflow:Anaconda环境 部署CPU与GPU通用的tensorflow:Anaconda环境
微信支付退款和退款结果查询接口简单实现(.Net 7.0)
本文介绍了如何通过C# SDK(SKIT.FlurlHttpClient.Wechat.TenpayV3)来实现微信的退款和状态查询两接口。
微信支付退款和退款结果查询接口简单实现(.Net 7.0) 微信支付退款和退款结果查询接口简单实现(.Net 7.0)
ArgoWorkflow 教程(一)--DevOps 另一选择?云原生 CICD 初体验
本文主要记录了如何在 k8s 上快速部署云原生的工作流引擎 ArgoWorkflow。 ArgoWorkflow 是什么 Argo Workflows 是一个开源的云原生工作流引擎,用于在 Kubernetes 上编排并行作业。Argo 工作流作为Kubernetes CRD 实现。 定义工作流,其
ArgoWorkflow 教程(一)--DevOps 另一选择?云原生 CICD 初体验 ArgoWorkflow 教程(一)--DevOps 另一选择?云原生 CICD 初体验 ArgoWorkflow 教程(一)--DevOps 另一选择?云原生 CICD 初体验