宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動(dòng)態(tài)
精選推薦

Spring Boot 中使用 JSON Schema 來(lái)校驗(yàn)復(fù)雜JSON數(shù)據(jù)

管理 管理 編輯 刪除

JSON是我們編寫API時(shí)候用于數(shù)據(jù)傳遞的常用格式,那么你是否知道JSON Schema呢?

在數(shù)據(jù)交換領(lǐng)域,JSON Schema 以其強(qiáng)大的標(biāo)準(zhǔn)化能力,為定義和規(guī)范 JSON 數(shù)據(jù)的結(jié)構(gòu)與規(guī)則提供了有力支持。通過一系列精心設(shè)計(jì)的關(guān)鍵字,JSON Schema 能夠詳盡地描述數(shù)據(jù)的各項(xiàng)屬性。然而,僅憑 JSON Schema 本身,尚不足以驗(yàn)證 JSON 實(shí)例是否嚴(yán)格遵循預(yù)設(shè)的模式。此時(shí),JSON Schema 驗(yàn)證器的角色便顯得尤為關(guān)鍵。這些驗(yàn)證器如同嚴(yán)格的檢查官,確保每一個(gè) JSON 文檔都能忠實(shí)地反映出模式的定義。JSON Schema 驗(yàn)證器,作為實(shí)現(xiàn) JSON Schema 規(guī)范的技術(shù)工具,其靈活的集成能力使得無(wú)論項(xiàng)目規(guī)模大小,都能輕松地將 JSON Schema 融入開發(fā)流程,從而提升數(shù)據(jù)處理的效率與準(zhǔn)確性。

d74c7202412171728061274.png

下面我們來(lái)看看如何在Spring Boot應(yīng)用中使用JSON Schema校驗(yàn)JSON數(shù)據(jù)

#動(dòng)手試試

  1. 創(chuàng)建一個(gè)基本的Spring Boot應(yīng)用,如果還不會(huì)可以點(diǎn)擊查看快速入門open in new window
  2. 在pom.xml中添加json-schema-validator依賴

  com.networknt
  json-schema-validator
  1.4.0

3.  創(chuàng)建JSON Schema

src/main/resources目錄下創(chuàng)建一個(gè)validation.json文件,然后在里面制定一套詳盡的驗(yàn)證規(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來(lái)創(chuàng)建,但實(shí)戰(zhàn)中還是推薦用Spring管理這些實(shí)例,比如 下面這樣:

@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)建一個(gè)Controller,當(dāng)接收到來(lái)自客戶端的JSON數(shù)據(jù)之后,就可以像下面這樣對(duì)json數(shù)據(jù)進(jìn)行校驗(yàn):

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.  測(cè)試一下

啟動(dòng) Sprint Boot 應(yīng)用,然后使用你喜歡的http客戶端工具對(duì)/test接口發(fā)送測(cè)試請(qǐng)求:

比如,下面使用Curl來(lái)進(jìn)行測(cè)試:

  • 符合規(guī)則的合法請(qǐng)求:
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
}'

校驗(yàn)通過,返回:[],沒有錯(cuò)誤信息

  • 不符合規(guī)則的非法請(qǐng)求(卻少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
}'

校驗(yàn)失敗,將返回錯(cuò)誤信息:[$.order_id: is missing but it is required]

好了,今天的分享就到這里,希望對(duì)您有用。


注:本文轉(zhuǎn)載自“程序猿DD”,如有侵權(quán),請(qǐng)聯(lián)系刪除!

請(qǐng)登錄后查看

哈哈哈醬 最后編輯于2024-12-18 14:54:17

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
1778
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁(yè)頭條 首頁(yè)動(dòng)態(tài) 首頁(yè)推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服