知識庫 / JSON RSS 訂閱

Java 中 JSON Schema 簡介

JSON
HongKong
7
09:56 PM · Dec 05 ,2025

1. 概述

JSON 模式 是一種聲明性語言,用於驗證 JSON 對象 的格式和結構。 它允許我們指定所需的特殊原始數據數量,從而精確描述一個有效的 JSON 對象 的樣子。

JSON 模式 規範分為三個部分:

    JSON 模式核心: JSON 模式核心規範是定義模式術語的地方。
  • JSON 模式驗證: JSON 模式驗證規範是定義有效驗證約束的方法文檔。 該文檔還定義了一組可以用於指定 JSON API 驗證的關鍵字。 在後續的示例中,我們將使用一些這些關鍵字。
  • JSON 超模式: 這是一個 JSON 模式規範的擴展,其中定義了超鏈接和超媒體相關的關鍵字。
2. 定義 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 。我們已將 idname 定義為 string,並將 price 定義為 number

JSON Schema 中,number 可以具有 exclusiveMinimum

最後,Schema 告訴我們,idnamepricerequired 的。

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 對象表示形式結合起來,我們可以執行一些驗證任務。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.