JSON是我們編寫API時候用于數(shù)據(jù)傳遞的常用格式,那么你是否知道JSON Schema呢?
在數(shù)據(jù)交換領(lǐng)域,JSON Schema 以其強大的標(biāo)準(zhǔn)化能力,為定義和規(guī)范 JSON 數(shù)據(jù)的結(jié)構(gòu)與規(guī)則提供了有力支持。通過一系列精心設(shè)計的關(guān)鍵字,JSON Schema 能夠詳盡地描述數(shù)據(jù)的各項屬性。然而,僅憑 JSON Schema 本身,尚不足以驗證 JSON 實例是否嚴(yán)格遵循預(yù)設(shè)的模式。此時,JSON Schema 驗證器的角色便顯得尤為關(guān)鍵。這些驗證器如同嚴(yán)格的檢查官,確保每一個 JSON 文檔都能忠實地反映出模式的定義。JSON Schema 驗證器,作為實現(xiàn) JSON Schema 規(guī)范的技術(shù)工具,其靈活的集成能力使得無論項目規(guī)模大小,都能輕松地將 JSON Schema 融入開發(fā)流程,從而提升數(shù)據(jù)處理的效率與準(zhǔn)確性。
下面我們來看看如何在Spring Boot應(yīng)用中使用JSON Schema校驗JSON數(shù)據(jù)
#動手試試
- 創(chuàng)建一個基本的Spring Boot應(yīng)用,如果還不會可以點擊查看快速入門open in new window
- 在pom.xml中添加json-schema-validator依賴
com.networknt
json-schema-validator
1.4.0
3. 創(chuàng)建JSON Schema
在src/main/resources
目錄下創(chuàng)建一個validation.json
文件,然后在里面制定一套詳盡的驗證規(guī)則,比如下面這樣:
{
"$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"
}
}
}
}
}
}
4. 創(chuàng)建 JsonSchema 的 Bean
當(dāng)然,你也可以直接new來創(chuàng)建,但實戰(zhàn)中還是推薦用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 ) );
}
}
5. 使用 JsonSchema
@Slf4j
@Service
public class JsonSchemaValidationService{
@Autowired
private JsonSchema jsonSchema;
public String validateJson(JsonNode jsonNode){
Set errors = jsonSchema.validate(jsonNode);
if(errors.isEmpty()){
log.info("event is valid");
}else{
log.info("event is invalid");
}
return errors.toString();
}
}
6. 在 Web 層的應(yīng)用
創(chuàng)建一個Controller,當(dāng)接收到來自客戶端的JSON數(shù)據(jù)之后,就可以像下面這樣對json數(shù)據(jù)進行校驗:
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);
}
}
7. 測試一下
啟動 Sprint Boot 應(yīng)用,然后使用你喜歡的http客戶端工具對/test
接口發(fā)送測試請求:
比如,下面使用Curl來進行測試:
- 符合規(guī)則的合法請求:
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
}'
校驗通過,返回:[],沒有錯誤信息
- 不符合規(guī)則的非法請求(卻少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]
好了,今天的分享就到這里,希望對您有用。
注:本文轉(zhuǎn)載自“程序猿DD”,如有侵權(quán),請聯(lián)系刪除!