写点什么

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

作者:EquatorCoco
  • 2024-08-06
    福建
  • 本文字数:2085 字

    阅读完需:约 7 分钟

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 管理这些实例,比如 下面这样:

@Configurationpublic 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@Servicepublic 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;@RestControllerpublic 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]


文章转载自:程序猿DD

原文链接:https://www.cnblogs.com/didispace/p/18344858

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Spring Boot 中使用 JSON Schema 来校验复杂JSON数据_json_EquatorCoco_InfoQ写作社区