03.08 最快的json schema校驗器ajv模塊詳解,能同時支持04

上一篇文章我們詳細介紹瞭如何配置json schema,這篇文章介紹一個校驗工具——ajv,你可以把schema和需要校驗的數據傳給它,由它來完成校驗工作。話不多說,我開始敲代碼。

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖1

  • 先安裝ajv模塊;
  • 創建一個ajv實例;
  • 配置好schema,傳入ajv實例的compile方法中;
  • 再用compile方法返回的函數校驗數據;
  • 如果校驗失敗,ajv會輸出錯誤信息。
最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖2

如圖2所示,咱們故意把product數據改錯,控制檯打印出了詳細的錯誤信息。圖中dataPath是數據的路徑,schemaPath是報錯的schema關鍵字的路徑。

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖3

如圖3,我們也可以在ajv實例化的時候傳入多個schema,然後使用getSchema方法獲取對應的schema來校驗數據,這個方法的參數就是關鍵字$id的值。$id的含義在上一篇文章中我們已經講了,在此圖中雖然$id是一個uri,但是編輯器並不會去下載。細看圖中第一個schema,$ref的值是defs.json,轉化成絕對路徑是http://localhos:8000/defs.json,就是下面那個defSchema,也就是說$ref指向的schema在本文件中必須存在。如果在ajv實例化時只傳入schema不傳入defsSchema就會報錯。

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖4

如圖4所示,如果在ajv實例化時沒傳入defsSchema,也可以使用addSchema方法添加,效果是一樣的。

從上可以看出這些方法都是以$id作為schema的標識,使用addSchema方法的第二個參數可以自定義標識,如下:

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖5

圖5中我們把schema的標識改成了aa字符串,後面的getSchema方法可以通過aa字符串獲取到對應的schema。

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖6

如果你瞭解json pointer的話,還可以利用它做一些事情。如圖6中smaller的最大值要小於larger,這時可以使用json pointer語法將maximum的屬性值指向larger。

接下來說說利用ajv.addKeyword方法怎麼自定義關鍵字?

1、使用validate方法

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖7

如圖7傳入validate方法,參數schema是關鍵字的值,data是數據的值,validate方法返回的結果代表是否能通過驗證。

2、使用compile方法

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖8

如圖8,compile方法第一個參數是自定義關鍵字的值,第二參數是包含關鍵字的整個schema,這個方法返回一個函數,這個函數參數的值是對應的數據,它的處理的結果代表能否通過驗證。

3、使用macro方法

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖9

macro方法的參數是自定義關鍵字的值,經過處理返回一個新的schema,即用新的schema做校驗。

4、使用inline方法

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖10

inline方法第一個參數是編譯上下文環境,第二個參數是關鍵字名字,第三個參數是關鍵字對應的值,這個方法返回一個字符串。從控制檯打印的信息我們可以看出,其實返回的是一個序列化的表達式,這個表達式的執行結果代表數據驗證是否能通過。

讀到這裡,我相信聰明的你肯定能想到可以把上面的自定義關鍵字的邏輯封裝成插件,如下:

最快的json schema校驗器ajv模塊詳解,能同時支持04/06/07草案

圖11

社區已經提供了很多優秀的插件,比如webpack就在用ajv-keywords插件。

總結

這篇文章主要介紹了ajv如何使用,如果把json schema比作子彈,那麼ajv就可以比作手槍,手槍和子彈都得有才行。如果你在使用react或者vue時經常寫一些屬性的類型校驗,你會發現它和json schema很像,但是它們並不是一個東西,是框架自己開發的一套校驗邏輯。當然,校驗器肯定不止ajv一種,聰明的你們可以自己去發現開發更好的校驗器。

喜歡我的文章就關注我吧,有問題可以發表評論,我們一起學習,共同成長!


分享到:


相關文章: