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

cnblogs 2024-08-06 12:09:01 阅读 80

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数据

动手试试

    <li>

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

  1. 在<code>pom.xml中添加json-schema-validator依赖

<dependency>

<groupId>com.networknt</groupId>

<artifactId>json-schema-validator</artifactId>

<version>1.4.0</version>

</dependency>

    <li>创建JSON Schema

在<code>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"

}

}

}

}

}

}

    <li>创建 JsonSchema 的 Bean

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

<code>@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 ) );

}

}

    <li>使用 JsonSchema

<code>@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();

}

}

    <li>在 Web 层的应用

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

<code>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);

}

}

    <li>测试一下

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

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

    <li>符合规则的合法请求:

$ 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。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。