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

天空闲话  金牌会员 | 2024-8-6 10:47:00 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

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数据
动手试试


  • 创建一个基本的Spring Boot应用,如果还不会可以点击检察快速入门
  • 在pom.xml中添加json-schema-validator依赖
  1. <dependency>
  2.   <groupId>com.networknt</groupId>
  3.   <artifactId>json-schema-validator</artifactId>
  4.   <version>1.4.0</version>
  5. </dependency>
复制代码

  • 创建JSON Schema
在src/main/resources目录下创建一个validation.json文件,然后在内里制定一套详尽的验证规则,比如下面如许:
  1. {
  2. "$schema": "http://json-schema.org/draft-07/schema#",
  3.     "title": "Order Event",
  4.     "description": "Order event schema for example",
  5.     "required": ["order_id", "total_price", "products" ],
  6.     "properties": {
  7.        "order_id": {
  8.           "type": "string"
  9.         },
  10.         "event": {
  11.           "enum": ["PLACED", "DELIVERED", "RETURNED"],
  12.           "type": "string"
  13.         },
  14.         "total_price": {
  15.          "type": "number",
  16.              "minimum": 0
  17.      },
  18.         "products": {
  19.       "type": "array",
  20.       "items": {
  21.         "additionalProperties": true,
  22.         "required": ["product_id", "price"],
  23.         "minItems": 1,
  24.         "properties": {
  25.           "product_id": {
  26.             "type": "string"
  27.           },
  28.           "price": {
  29.             "type": "number",
  30.             "minimum": 0
  31.           },
  32.           "quantity": {
  33.             "type": "integer"
  34.           }
  35.         }
  36.       }
  37.     }
  38.    }
  39. }
复制代码

  • 创建 JsonSchema 的 Bean
当然,你也可以直接new来创建,但实战中还是推荐用Spring管理这些实例,比如 下面如许:
  1. @Configuration
  2. public class JsonSchemaConfiguration {
  3.     private static final String SCHEMA_VALIDATION_FILE = "validation.json";
  4.    
  5.     @Bean
  6.     public JsonSchema jsonSchema() {
  7.         return JsonSchemaFactory
  8.                 .getInstance( SpecVersion.VersionFlag.V7 )
  9.                 .getSchema( getClass().getResourceAsStream( SCHEMA_VALIDATION_FILE ) );
  10.     }
  11. }
复制代码

  • 使用 JsonSchema
  1. @Slf4j
  2. @Service
  3. public class JsonSchemaValidationService{
  4.   
  5.   @Autowired
  6.   private JsonSchema jsonSchema;
  7.   
  8.   public String validateJson(JsonNode jsonNode){
  9.    
  10.     Set<ValidationMessage> errors = jsonSchema.validate(jsonNode);
  11.     if(errors.isEmpty()){
  12.       log.info("event is valid");
  13.     }else{
  14.       log.info("event is invalid");
  15.      }
  16.       return errors.toString();
  17.   }
  18. }
复制代码

  • 在 Web 层的应用
创建一个Controller,当吸收到来自客户端的JSON数据之后,就可以像下面如许对json数据进行校验:
  1. import com.fasterxml.jackson.databind.JsonNode;
  2. @RestController
  3. public class JsonSchemaController {
  4.     @Autowired
  5.     private JsonSchemaValidationService service;
  6.     @PostMapping("/test")
  7.     public String validateEvent( @RequestBody JsonNode jsonNode ){
  8.        return service.validateJson(jsonNode);
  9.     }
  10. }
复制代码

  • 测试一下
启动 Sprint Boot 应用,然后使用你喜欢的http客户端工具对/test接口发送测试请求:
比如,下面使用Curl来进行测试:

  • 符合规则的正当请求:
  1. $ curl --location 'localhost:8080/test' \
  2. --header 'Content-Type: application/json' \
  3. --data '{
  4.   "order_id":"order134",
  5.    "event": "PLACED",
  6.    "products": [
  7.      {
  8.        "product_id": "product_1",
  9.         "price":20.5,
  10.        "quantity":2
  11.      }
  12.    ],
  13.    "total_price": 41
  14. }'
复制代码
校验通过,返回:[],没有错误信息

  • 不符合规则的非法请求(却少order id):
  1. $ curl --location 'localhost:8080/test' \
  2. --header 'Content-Type: application/json' \
  3. --data '{
  4.    "event": "PLACED",
  5.    "products": [
  6.      {
  7.        "product_id": "product_1",
  8.         "price":20.5,
  9.        "quantity":2
  10.      }
  11.    ],
  12.    "total_price": 41
  13. }'
复制代码
校验失败,将返回错误信息:[$.order_id: is missing but it is required]
好了,今天的分享就到这里,希望对您有用。如果您学习过程中如遇困难?可以加入我们超高质量的Spring技能交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,接待收藏与转发支持!
相关资料

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表