ToolDeck

Kiểm tra JSON Schema

Xác thực dữ liệu JSON theo JSON Schema (Draft 7)

Thử ví dụ

Dữ liệu JSON

JSON Schema

Chạy cục bộ · An toàn để dán thông tin bí mật
Chạy cục bộ · An toàn để dán thông tin bí mật

JSON Schema Validation là gì?

JSON Schema validation là quá trình kiểm tra xem một tài liệu JSON có tuân thủ các ràng buộc về cấu trúc và giá trị được định nghĩa trong JSON Schema hay không. Bản thân schema cũng là một tài liệu JSON mô tả hình dạng dữ liệu mong đợi: những thuộc tính nào là bắt buộc, kiểu dữ liệu của chúng phải là gì, phạm vi cho phép của số, mẫu chuỗi, độ dài mảng và nhiều hơn nữa. Đặc tả JSON Schema được duy trì tại json-schema.org và được xuất bản dưới dạng một loạt các bản thảo IETF, trong đó Draft 7 và Draft 2020-12 được áp dụng rộng rãi nhất.

Trong khi xác thực JSON thuần túy chỉ kiểm tra cú pháp (dấu ngoặc có khớp không? chuỗi có được đặt trong dấu ngoặc kép không?), xác thực schema đi xa hơn. Nó trả lời các câu hỏi như: phản hồi từ API này có chứa trường "id" luôn là số nguyên không? Trường "status" có phải là một trong ba giá trị được phép không? Các đối tượng lồng nhau có đúng cấu trúc không? Loại kiểm tra cấu trúc này bắt được các lỗi mà kiểm tra cú pháp bỏ sót hoàn toàn, vì JSON hợp lệ về mặt cú pháp vẫn có thể sai về mặt ngữ nghĩa đối với ứng dụng của bạn.

JSON Schema được sử dụng trong các định nghĩa OpenAPI/Swagger, xác thực tệp cấu hình, xác thực biểu mẫu, ràng buộc tài liệu cơ sở dữ liệu và kiểm thử tự động. Các công cụ như Ajv (JavaScript), jsonschema (Python) và check-jsonschema (CLI) triển khai đặc tả này để bạn có thể xác thực dữ liệu theo chương trình. Công cụ xác thực trực tuyến này cho phép bạn dán cả schema và tài liệu dữ liệu để kiểm tra sự phù hợp ngay lập tức, mà không cần cài đặt bất kỳ thư viện nào.

Tại sao sử dụng công cụ xác thực JSON Schema trực tuyến?

Viết schema và gỡ lỗi các lỗi xác thực theo cách thủ công rất chậm. Công cụ xác thực JSON Schema trực tuyến cung cấp phản hồi tức thì về việc dữ liệu của bạn có khớp với schema hay không, với thông báo lỗi rõ ràng chỉ đến đúng thuộc tính bị lỗi.

Phản hồi xác thực tức thì
Dán schema và dữ liệu vào, xem kết quả xác thực theo thời gian thực. Mỗi lỗi hiển thị đường dẫn JSON và ràng buộc cụ thể bị vi phạm, để bạn có thể sửa lỗi mà không cần đọc qua kết quả đầu ra của thư viện xác thực.
🔒
Xử lý cục bộ, bảo mật dữ liệu
Dữ liệu JSON của bạn không bao giờ rời khỏi trình duyệt. Toàn bộ quá trình xác thực chạy cục bộ bằng JavaScript. Không có máy chủ, không có nhật ký, không lưu trữ dữ liệu. An toàn cho các schema mô tả API nội bộ hoặc chứa tên trường độc quyền.
🎯
Xác thực đúng phiên bản draft
Công cụ xác thực hỗ trợ các từ khóa schema Draft 7 bao gồm type, required, properties, enum, pattern, minimum/maximum, items, anyOf, oneOf, allOf và additionalProperties. Kiểm tra schema của bạn tại đây trước khi tích hợp vào pipeline build hoặc bộ kiểm thử.
📋
Không cần tài khoản hay cài đặt
Mở trang, dán JSON và xác thực. Không cần npm install, pip package hay Docker image. Hữu ích khi bạn cần kiểm tra schema nhanh trên máy không thể cài đặt công cụ phát triển.

Các trường hợp sử dụng JSON Schema Validation

Kiểm thử hợp đồng API
Xác thực các phản hồi API so với schema được định nghĩa trong đặc tả OpenAPI của bạn. Phát hiện các thay đổi phá vỡ hợp đồng, chẳng hạn như một trường chuyển từ integer sang string, trước khi chúng đến môi trường production.
Kiểm tra tệp cấu hình
Kiểm tra các tệp cấu hình JSON cho pipeline CI/CD, Kubernetes manifest hoặc cài đặt ứng dụng có khớp với schema mong đợi trước khi commit. Ngăn ngừa lỗi triển khai do thiếu hoặc nhập sai khóa.
Cổng kiểm soát pipeline DevOps
Thêm xác thực schema làm bước CI để từ chối các payload vi phạm hợp đồng. Điều này hoạt động với tệp biến Terraform, đầu vào GitHub Actions hoặc bất kỳ JSON có cấu trúc nào được tự động hóa sử dụng.
Xem xét dữ liệu kiểm thử và QA
Xác minh rằng các fixture kiểm thử và tệp dữ liệu giả lập tuân thủ cùng schema mà ứng dụng của bạn mong đợi. Dữ liệu kiểm thử không khớp là nguyên nhân phổ biến gây ra kết quả kiểm thử dương tính giả.
Tiếp nhận dữ liệu vào pipeline
Xác thực các bản ghi JSON đến ở đầu vào của pipeline dữ liệu. Xác thực schema lọc ra các sự kiện không đúng định dạng trước khi chúng đến kho dữ liệu, giảm chi phí làm sạch dữ liệu về sau.
Học cú pháp JSON Schema
Thử nghiệm với các từ khóa schema một cách tương tác. Viết schema, dán dữ liệu kiểm thử và xem ràng buộc nào vượt qua hoặc thất bại. Nhanh hơn việc viết script và chạy từ terminal mỗi lần.

Tài liệu tham khảo các từ khóa JSON Schema

Một JSON Schema được xây dựng từ các từ khóa, mỗi từ khóa áp đặt một ràng buộc lên dữ liệu được xác thực. Bảng dưới đây liệt kê các từ khóa được sử dụng phổ biến nhất trong Draft 7 và các phiên bản sau. Mỗi từ khóa có thể kết hợp với các từ khóa khác trong cùng một đối tượng schema.

Từ khóaMục đíchVí dụ
typeRestricts the data type"type": "string"
propertiesDefines expected object keys and their schemas"properties": { "name": { "type": "string" } }
requiredLists mandatory properties"required": ["id", "name"]
itemsSchema for array elements"items": { "type": "number" }
enumRestricts value to a fixed set"enum": ["active", "inactive"]
patternRegex constraint on strings"pattern": "^[A-Z]{2}\\d{4}$"
minimum / maximumNumeric range bounds"minimum": 0, "maximum": 100
minLength / maxLengthString length bounds"minLength": 1, "maxLength": 255
$refReuses another schema by URI"$ref": "#/$defs/address"
additionalPropertiesControls extra keys in objects"additionalProperties": false
anyOf / oneOf / allOfCombines multiple schemas logically"anyOf": [{ "type": "string" }, { "type": "null" }]
if / then / elseConditional schema application"if": { "properties": { "type": { "const": "email" } } }

So sánh các phiên bản JSON Schema: Draft 7 so với 2019-09 so với 2020-12

JSON Schema đã trải qua nhiều phiên bản draft. Draft 7 (xuất bản năm 2018) được hỗ trợ rộng rãi nhất trong các công cụ. Draft 2019-09 giới thiệu $defs (thay thế definitions), unevaluatedProperties và $recursiveRef. Draft 2020-12 (phiên bản ổn định mới nhất) thay thế $recursiveRef bằng $dynamicRef và giới thiệu prefixItems để xác thực tuple. Khi chọn phiên bản draft, hãy kiểm tra thư viện xác thực của bạn có hỗ trợ nó không. Ajv hỗ trợ cả ba draft. Thư viện jsonschema của Python hỗ trợ đến 2020-12 kể từ phiên bản 4.0.

Tính năngDraft 7Draft 2019-09Draft 2020-12
$schema URIdraft-07/schema#2019-09/schema2020-12/schema
if / then / elseYesYesYes
$defs (definitions)definitions$defs$defs
$ref alongside keysNo (sibling ignored)YesYes
$dynamicRefNoNo ($recursiveRef)Yes
prefixItemsNo (use items array)No (use items array)Yes
unevaluatedPropertiesNoYesYes
$vocabularyNoYesYes

Ví dụ mã nguồn

Các ví dụ này minh họa cách xác thực JSON theo schema theo chương trình. Mỗi ví dụ sử dụng một thư viện được bảo trì tốt cho hệ sinh thái ngôn ngữ của nó.

JavaScript (Ajv)
import Ajv from 'ajv';

const ajv = new Ajv();

const schema = {
  type: 'object',
  properties: {
    name: { type: 'string', minLength: 1 },
    age: { type: 'integer', minimum: 0 },
    email: { type: 'string', format: 'email' }
  },
  required: ['name', 'email'],
  additionalProperties: false
};

const data = { name: 'Alice', age: 30, email: 'alice@example.com' };

const validate = ajv.compile(schema);
const valid = validate(data);
console.log(valid);          // → true
console.log(validate.errors); // → null

// Invalid data — missing required "email"
validate({ name: 'Bob', age: 25 });
console.log(validate.errors);
// → [{ instancePath: '', keyword: 'required', params: { missingProperty: 'email' } }]
Python (jsonschema)
from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 1},
        "age": {"type": "integer", "minimum": 0},
        "tags": {
            "type": "array",
            "items": {"type": "string"},
            "uniqueItems": True
        }
    },
    "required": ["name"]
}

# Valid data
validate(instance={"name": "Alice", "age": 30, "tags": ["admin"]}, schema=schema)
# → No exception raised

# Invalid data — wrong type for "age"
try:
    validate(instance={"name": "Alice", "age": "thirty"}, schema=schema)
except ValidationError as e:
    print(e.message)
    # → 'thirty' is not of type 'integer'
    print(e.json_path)
    # → $.age
Go (santhosh-tekuri/jsonschema)
package main

import (
    "fmt"
    "strings"
    "github.com/santhosh-tekuri/jsonschema/v5"
)

func main() {
    schemaJSON := `{
        "type": "object",
        "properties": {
            "id": { "type": "integer" },
            "status": { "enum": ["active", "inactive"] }
        },
        "required": ["id", "status"]
    }`

    compiler := jsonschema.NewCompiler()
    compiler.AddResource("schema.json", strings.NewReader(schemaJSON))
    schema, _ := compiler.Compile("schema.json")

    // Valid data
    data := map[string]interface{}{"id": 1, "status": "active"}
    err := schema.Validate(data)
    fmt.Println(err) // → <nil>

    // Invalid — missing "status"
    bad := map[string]interface{}{"id": 2}
    err = schema.Validate(bad)
    fmt.Println(err) // → validation failed: missing properties: 'status'
}
CLI (check-jsonschema)
# Install via pip
pip install check-jsonschema

# Validate a file against a schema
check-jsonschema --schemafile schema.json data.json
# → ok -- validation done

# Validate against a remote schema (e.g., GitHub Actions workflow)
check-jsonschema --builtin-schema vendor.github-workflows my-workflow.yml

# Validate multiple files at once
check-jsonschema --schemafile schema.json file1.json file2.json file3.json

Câu hỏi thường gặp

Sự khác biệt giữa xác thực JSON và xác thực JSON Schema là gì?
Xác thực JSON kiểm tra xem một chuỗi có phải là cú pháp JSON hợp lệ không: dấu ngoặc lồng đúng, khóa được đặt trong dấu ngoặc kép, không có dấu phẩy thừa. Xác thực JSON Schema đi xa hơn và kiểm tra xem dữ liệu JSON đã phân tích có khớp với một hợp đồng cấu trúc không: kiểu dữ liệu đúng, các trường bắt buộc có mặt, giá trị trong phạm vi cho phép. Bạn cần JSON hợp lệ trước khi áp dụng schema, nhưng JSON hợp lệ vẫn có thể thất bại xác thực schema.
Tôi nên sử dụng phiên bản JSON Schema draft nào?
Draft 7 là lựa chọn an toàn nhất. Nó có hỗ trợ thư viện rộng rãi nhất trên nhiều ngôn ngữ và bao gồm các từ khóa mà hầu hết các dự án cần: type, properties, required, enum, pattern, anyOf, oneOf, allOf và $ref. Sử dụng Draft 2020-12 nếu bạn cần các tính năng như prefixItems để xác thực tuple, $dynamicRef cho schema có thể mở rộng hoặc unevaluatedProperties cho cấu trúc đối tượng nghiêm ngặt. Kiểm tra tài liệu thư viện xác thực của bạn để xác nhận hỗ trợ draft trước khi nâng cấp.
$ref hoạt động như thế nào trong JSON Schema?
Từ khóa $ref cho phép bạn tham chiếu schema khác theo URI thay vì sao chép nó. Giá trị như "$ref": "#/$defs/address" trỏ đến schema được định nghĩa trong phần $defs của cùng tài liệu. Bạn cũng có thể tham chiếu tệp bên ngoài với "$ref": "https://example.com/schemas/address.json". Trong Draft 7, $ref thay thế tất cả các từ khóa cùng cấp trong cùng đối tượng. Trong Draft 2019-09 và sau đó, các từ khóa cùng cấp được áp dụng song song với $ref.
Sự khác biệt giữa anyOf, oneOf và allOf là gì?
allOf yêu cầu dữ liệu khớp với mọi sub-schema trong mảng. anyOf yêu cầu khớp với ít nhất một sub-schema. oneOf yêu cầu khớp với đúng một sub-schema và thất bại nếu dữ liệu khớp không có hoặc nhiều hơn một. Đối với các trường có thể null, anyOf với type và null là phổ biến: {"anyOf": [{"type": "string"}, {"type": "null"}]}. Sử dụng oneOf khi các sub-schema loại trừ lẫn nhau, chẳng hạn như union có gắn nhãn.
JSON Schema có thể xác thực đối tượng lồng nhau và mảng không?
Có. Sử dụng từ khóa properties để định nghĩa schema cho các khóa đối tượng lồng nhau, và từ khóa items để định nghĩa schema mà mọi phần tử mảng phải khớp. Bạn có thể lồng các schema này đến bất kỳ độ sâu nào. Đối với các mảng mà mỗi vị trí có schema khác nhau (tuple), sử dụng prefixItems trong Draft 2020-12 hoặc dạng mảng của items trong Draft 7.
Dữ liệu tôi dán vào công cụ này có được gửi đến máy chủ không?
Không. Công cụ xác thực chạy hoàn toàn trong trình duyệt của bạn bằng JavaScript. Dữ liệu JSON và schema của bạn không bao giờ được truyền đến bất kỳ máy chủ nào. Bạn có thể xác minh điều này bằng cách mở trình kiểm tra mạng của trình duyệt khi sử dụng công cụ.
Làm thế nào để xác thực JSON Schema trong pipeline CI/CD?
Sử dụng công cụ xác thực dòng lệnh như check-jsonschema (Python/pip) hoặc ajv-cli (Node.js/npm). Cả hai đều nhận tệp schema và một hoặc nhiều tệp dữ liệu làm đối số. Thêm lệnh xác thực làm một bước trong cấu hình CI của bạn. Nếu xác thực thất bại, tiến trình thoát với mã khác không, chặn pipeline. Với GitHub Actions, bạn cũng có thể sử dụng trực tiếp action check-jsonschema.