Spring Boot 中使用 JSON Schema 來校驗複雜JSON資料

程序猿DD發表於2024-08-06

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教程可以點選直達!,歡迎收藏與轉發支援!

相關資料

  • What is JSON Schema?
  • JSON Schema validator

歡迎關注我的公眾號:程式猿DD。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源

相關文章