前端如何做大量的數據校驗?json schema配置詳解

這篇文章主要介紹如何使用json schema,如果你已經對它很熟悉了,可以不用繼續往下看了,節約時間。

場景一:

幾年前我在我的老東家做發佈業務,每天開發表單,對於用戶輸入的各種數據都要進行校驗,校驗邏輯寫了一堆,特別繁瑣。

場景二:

用過webpack的小夥伴肯定知道,在使用webpack之前需要寫一個配置文件webpack.config.js。我相信大多數前端並不知道其實webpack的配置有上百個,如果每個配置屬性都需要webpack的作者去寫一個校驗邏輯,那我估計作者就沒時間去拓展webpack的功能了。

有沒有什麼辦法去簡化這樣的校驗工作?有,json schema就可以幫我們去做這樣的事情。下面開始介紹如何配置json schema,雖然有點枯燥,但是如果你連語法都不清楚,那如何去使用呢?

簡單類型

在json schema中有以下幾個類型,

  • string
  • boolean
  • null
  • enum
  • Numeric types
  • array
  • object

首先來看一下string類型

前端如何做大量的數據校驗?json schema配置詳解

圖1

如圖1所示,左側是schema,右側是需要驗證的數據(也被稱為實例)。type是關鍵字,代表數據的類型,此處我們驗證數據是不是字符串,發現結果是ok的。

咱們還可以限制字符串的長度,如下:

前端如何做大量的數據校驗?json schema配置詳解

圖2

minLength代表最小長度,maxLength代表最大長度。也可以通過正則去校驗字符串,如下:

前端如何做大量的數據校驗?json schema配置詳解

圖3

pattern屬性可以用來寫正則,不過普通正則的語法支持的不多,所以如果你發現有些正則關鍵字不生效,你也不要驚訝。

類型null和boolean比較簡單,沒什麼好說的。

其實枚舉也很簡單,如下:

<code>{
"type": "string",
"enum": ["red", "amber", "green"]
}/<code>

提供幾個可選的值,如果枚舉的值只有一個,可以使用const屬性

<code>{
"type": "string",
"{
"type": "string",
"enum": ["red", "amber", "green"]
}"
"enum": ["red"]
}/<code>

類型是Numeric,它有兩種寫法,一種是integer,它只能是整數,不能是浮點數。另外一種是number,它既可以是整數也可以是浮點數,如下圖

前端如何做大量的數據校驗?json schema配置詳解

圖4

圖4中,multipleOf屬性代表數據只能是這個屬性值的倍數,比如上圖1.2是0.6的2倍,驗證通過,如果數據是1.3,校驗就會失敗。數字當然也是能夠限制大小的,4個屬性如下:

  • x ≥ minimum
  • x > exclusiveMinimum
  • x ≤ maximum
  • x < exclusiveMaximum
  • 接下來就是數組類型——array,用法和上面一樣,如果你想校驗數組的元素可以用items屬性,如下:

    前端如何做大量的數據校驗?json schema配置詳解

    圖5


    前端如何做大量的數據校驗?json schema配置詳解

    圖6

    上圖中additionalItems屬性代表數組額外添加的元素的類型,此圖中本來只有兩個數組元素,如果添加第三,那它必須是bool類型。additionalItems屬性也可以直接是bool值,代表允許或者不允許添加額外的元素。還有其他的屬性如下:

    • minItems和maxItems代表數組的最小長度和最大長度;
    • uniqueItems代表數組的元素能否重複;
    • contains代表數組必須包含某種類型。

    最複雜的就是描述一個對象,類型是object,如下:

    前端如何做大量的數據校驗?json schema配置詳解

    圖7

    如圖7所示,可以在properties屬性中定義數據的key-value,required代表必須存在的屬性。和數組一樣,它也有個additionalProperties屬性,代表有沒有額外的屬性添加,用法和數組一樣。

    前端如何做大量的數據校驗?json schema配置詳解

    圖8

    用propertyNames屬性還可以對key做校驗,另外,minProperties和maxProperties可以限制屬性的個數。

    還有一個有意思的屬性是dependencies,它的含義是一個屬性存在的前提是另外一個屬性也存在。

    前端如何做大量的數據校驗?json schema配置詳解

    圖9

    如圖9,屬性aa存在的前提是cc屬性也存在,如果cc不存在,只有aa,那麼就會報錯。

    結合類型

    結合類型有三個

    1、anyOf 代表只要匹配一個即可

    前端如何做大量的數據校驗?json schema配置詳解

    圖10

    如上圖,anyof數組中匹配任何一個即可。

    2、allOf代表所有的類型都要匹配

    前端如何做大量的數據校驗?json schema配置詳解

    圖11

    滿足allof數組中的所有條件。

    3、oneOf只能滿足其中一個,都不滿足或者滿足一個以上都會報錯

    前端如何做大量的數據校驗?json schema配置詳解

    圖12

    4、not 和非一個意思,即不滿足not指定的類型,校驗就可以通過。

    條件判斷

    直接上例子,如下:

    前端如何做大量的數據校驗?json schema配置詳解

    圖13

    如圖13所示,if為條件語句,if正確即校驗then語句,if不正確校驗else語句。圖中因為a的數據是b,所以res的數據必須是bbb,反之就是ccc。

    此語法沒有if else語句,所以如果想要進行多個條件的判斷可以和allOf配合使用如下:

    前端如何做大量的數據校驗?json schema配置詳解

    圖14


    公共部分引用

    對於一些重複的校驗類型可以提取公共的部分,使用關鍵字definitions,如下:

    前端如何做大量的數據校驗?json schema配置詳解

    圖15

    引用的時候使用$ref關鍵字,如果是在本文件定義的公共部分,直接用#/definitions/屬性 即可。

    如果是外部文件,也可以是相對或者絕對的URI地址。

    幾個特殊關鍵字

    1、$schema屬性可以聲明使用的schema版本,也可當做schema的標識,因為schema本身也是json,有了這個屬性,就代表它不是一個普通的json而是schema。

    2、title屬性標識一下名稱;

    3、description屬性對schema做詳細的描述;

    <code>{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://example.com/product.schema.json",
    "title": "Product",
    "description": "A product in the catalog",
    "type": "object"
    }/<code>

    上面代碼塊中有一個關鍵字$id,它有什麼用呢?

    一是為了唯一標識這個schema,二是為$ref提供base路徑。以上面的代碼塊為例,如果$ref的值是person.json,那麼引用的整個路徑就是http://example.com/person.json。

    總結

    這個文章就是教大家如何配json schema,下一篇文章會說如何校驗。

    附一個在線校驗地址:https://jsonschemalint.com/#!/version/draft-07/markup/json


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


    分享到:


    相關文章: