1. 概述
JSON 模式 是一種聲明性語言,用於驗證 JSON 對象 的格式和結構。 它允許我們指定所需的特殊原始數據數量,從而精確描述一個有效的 JSON 對象 的樣子。JSON 模式 規範分為三個部分:
- JSON 模式核心: JSON 模式核心規範是定義模式術語的地方。
- JSON 模式驗證: JSON 模式驗證規範是定義有效驗證約束的方法文檔。 該文檔還定義了一組可以用於指定 JSON API 驗證的關鍵字。 在後續的示例中,我們將使用一些這些關鍵字。
- JSON 超模式: 這是一個 JSON 模式規範的擴展,其中定義了超鏈接和超媒體相關的關鍵字。
現在我們已經瞭解了 JSON 模式 的用途,接下來我們創建一個 JSON 對象 及其對應的 JSON 模式,以描述該對象。
以下是一個簡單的 JSON 對象,代表產品目錄:
{
"id": 1,
"name": "Lampshade",
"price": 0
}我們也可以這樣定義它的JSON Schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Product",
"description": "A product from the catalog",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a product",
"type": "integer"
},
"name": {
"description": "Name of the product",
"type": "string"
},
"price": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": ["id", "name", "price"]
}如我們所見,JSON Schema 是一種 JSON 文檔,並且該文檔必須是一個對象。JSON Schema 中定義的對象成員(或屬性)被稱為 關鍵詞 。
讓我們解釋一下我們在示例中使用的關鍵詞:
- $schema 關鍵詞表明該模式符合 v4 草案規範。
- title 和 description 關鍵詞僅用於描述,它們不為驗證的數據添加約束。模式的意圖通過這兩個關鍵詞表達:描述一個產品。
- type 關鍵詞 定義了第一個約束 在我們的 JSON 數據上:它 必須是 一個 JSON 對象 。
此外,JSON Schema 可能會包含不是關鍵詞的屬性。在本例中,id name price 將是 JSON 對象 的成員(或屬性)。
對於每個屬性,我們可以定義 type 。我們已將 id 和 name 定義為 string,並將 price 定義為 number 。
在 JSON Schema 中,number 可以具有 exclusiveMinimum 。
最後,Schema 告訴我們,id、name 和 price 是 required 的。
3. 使用 JSON 模式進行驗證
藉助我們部署的 JSON 模式,我們可以驗證我們的 JSON 對象。
有許多 庫可以完成此任務。對於我們的示例,我們選擇了 Java json-schema 庫。
首先,我們需要將以下依賴項添加到我們的 pom.xml 中:
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>1.4.0</version>
</dependency>
最後,我們可以編寫幾個簡單的測試用例來驗證我們的JSON 對象:
@Test
public void givenInvalidInput_whenValidating_thenInvalid() throws IOException {
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
JsonSchema jsonSchema = factory.getSchema(
JSONSchemaUnitTest.class.getResourceAsStream("/schema.json"));
JsonNode jsonNode = mapper.readTree(
JSONSchemaUnitTest.class.getResourceAsStream("/product_invalid.json"));
Set<ValidationMessage> errors = jsonSchema.validate(jsonNode);
assertThat(errors).isNotEmpty().asString().contains("price: must have an exclusive minimum value of 0");
}在這種情況下,將會收到驗證錯誤。
第二個測試如下所示:
@Test
public void givenValidInput_whenValidating_thenValid() throws ValidationException {
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
JsonSchema jsonSchema = factory.getSchema(
JSONSchemaUnitTest.class.getResourceAsStream("/schema.json"));
JsonNode jsonNode = mapper.readTree(
JSONSchemaUnitTest.class.getResourceAsStream("/product_valid.json"));
Set<ValidationMessage> errors = jsonSchema.validate(jsonNode);
assertThat(errors).isEmpty();
}由於我們使用有效的 JSON 對象,因此不會拋出任何驗證錯誤。
4. 結論
本文介紹了 JSON 模式的概念,並列舉了一些有助於我們定義模式的相關關鍵詞。
通過將 JSON 模式與其對應的 JSON 對象表示形式結合起來,我們可以執行一些驗證任務。