Spring Boot 中使用 JSON Schema 來校驗復雜 JSON 數據
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應用,如果還不會可以點擊查看Spring Boot快速入門[1]
- 在pom.xml中添加json-schema-validator依賴
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>1.4.0</version>
</dependency>
- 創建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"
}
}
}
}
}
}
- 創建 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 ) );
}
}
- 使用 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();
}
}
- 在 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);
}
}
- 測試一下
啟動 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]
參考資料
[1]Spring Boot快速入門: https://www.didispace.com/spring-boot-2/1-2-quick-start.html
[2]Spring技術交流群: https://www.didispace.com/jiaqun.html
[3]Spring Boot教程可以點擊直達!: https://www.didispace.com/spring-boot-2/
[4]What is JSON Schema?: https://json-schema.org/overview/what-is-jsonschema
[5]JSON Schema validator: https://www.jsonschemavalidator.net/