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
依賴
<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]
好了,今天的分享就到這裡,希望對您有用。如果您學習過程中如遇困難?可以加入我們超高質量的Spring技術交流群,參與交流與討論,更好的學習與進步!更多Spring Boot教程可以點選直達!,歡迎收藏與轉發支援!
相關資料
- What is JSON Schema?
- JSON Schema validator
歡迎關注我的公眾號:程式猿DD。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源