Trình xác thực JSON Schema

Dán một lược đồ và một tài liệu, chọn bản nháp; trình xác thực sẽ đối chiếu tài liệu với mọi từ khóa mà lược đồ của bạn sử dụng, type, required, enum, oneOf, $ref, if/then/elseformat tùy chỉnh, đồng thời báo cáo từng vi phạm kèm theo một con trỏ kiểu JSONPath trỏ đến đúng vị trí gây lỗi.

Cách xác thực theo một lược đồ

  1. 1

    Dán lược đồ

    JSON Schema bản nháp 04, 07 hoặc 2020-12. Từ khóa `$schema` (nếu có) sẽ tự động chọn bản nháp tương ứng.

  2. 2

    Dán tài liệu

    JSON mà bạn muốn xác thực. Trước tiên, nó phải là JSON hợp lệ; các lỗi cú pháp sẽ được hiển thị trước khi đánh giá lược đồ.

  3. 3

    Xác thực

    Mỗi vi phạm đều được báo cáo kèm theo một con trỏ JSON (`/user/email`) và từ khóa bị lỗi (`format`, `required`, v.v.).

  4. 4

    Sửa và xác thực lại

    Chỉnh sửa bất kỳ bên nào và trạng thái sẽ cập nhật ngay lập tức.

Các từ khóa được hỗ trợ

Cốt lõi: type, enum, const, multipleOf, maximum, minimum, exclusiveMaximum, exclusiveMinimum, maxLength, minLength, pattern, maxItems, minItems, uniqueItems, maxContains, minContains, maxProperties, minProperties, required, dependentRequired.

Tổ hợp: allOf, anyOf, oneOf, not.

Bộ áp dụng: properties, patternProperties, additionalProperties, items, prefixItems, contains, propertyNames.

Điều kiện: if, then, else, dependentSchemas.

Tham chiếu: $ref, $defs, $id, $anchor.

Định dạng (có xác thực khi được bật): date-time, date, time, duration, email, hostname, ipv4, ipv6, uri, uuid, regex.

Kết quả lỗi

FAIL  /user/email        format            "not-an-email" is not a valid "email"
FAIL  /user/age          minimum           -3 is less than the minimum 0
FAIL  /orders/0/total    type              "42" is not of type "number"
FAIL  /                  required          missing required property "shippingAddress"

Mỗi lỗi đều bao gồm đường dẫn và từ khóa bị lỗi, giúp bạn dễ dàng tìm thấy trong trình soạn thảo.

Những khác biệt giữa các bản nháp dễ gây rắc rối

Từ khóa Bản nháp 04 Bản nháp 07 Bản nháp 2020-12
id so với $id id $id $id
exclusiveMaximum dưới dạng bool Số Số
Cú pháp mảng items items items prefixItems
$ref cho phép các từ khóa cùng cấp Không Không

Hãy thiết lập đúng bản nháp; việc xác thực một lược đồ bản nháp 04 dưới dạng 2020-12 sẽ diễn giải sai id và một số điểm tinh tế khác.

Các quy trình làm việc điển hình

  • Kiểm thử hợp đồng API: Trước khi triển khai, hãy chạy lược đồ OpenAPI đã tạo hoặc cập nhật với các phản hồi mẫu thực tế.
  • Tăng cường cấu hình: Kiểm tra từng tệp cấu hình YAML/JSON trong CI với một lược đồ trước khi hợp nhất.
  • Nạp dữ liệu: Từ chối sớm các payload không khớp với hình thức mong đợi, kèm theo thông báo lỗi rõ ràng.

Các lỗi phổ biến

  • Quên thực thi format. Theo mặc định, hầu hết các trình xác thực đều coi các định dạng không xác định chỉ là chú thích. Hãy bật xác thực định dạng nghiêm ngặt để thực sự từ chối các email và ngày tháng không hợp lệ.
  • Lạm dụng oneOf. Nếu hai nhánh của oneOf chồng lấn nhau, tài liệu sẽ thất bại (nó phải khớp chính xác với đúng một nhánh). Hãy dùng anyOf hoặc các mẫu phân biệt.
  • Lược đồ chặt chẽ với additionalProperties: false. Việc thêm một trường tùy chọn mới sẽ trở thành một thay đổi phá vỡ tương thích. Hãy bỏ qua nó trừ khi bạn thực sự muốn một đối tượng khép kín.

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

Có. Các bản nháp 2020-12, 07 và 04 đều được hỗ trợ. Trình xác thực sẽ đọc từ khóa $schema trong tài liệu của bạn để chọn đúng bản, hoặc quay về bộ chọn trong giao diện người dùng.

Các định dạng tiêu chuẩn (email, date-time, uuid, ipv4, v.v.) sẽ được xác thực khi bật chế độ định dạng nghiêm ngặt. Các định dạng tùy chỉnh được khai báo trong lược đồ của bạn chỉ được coi là chú thích, trừ khi bạn cung cấp một regex với pattern.

Các tham chiếu nội bộ (#/$defs/foo) được phân giải tự động. Vì lý do bảo mật, các tham chiếu HTTP bên ngoài không được tải theo mặc định. Trước tiên hãy nội tuyến các tham chiếu bên ngoài, hoặc dùng một công cụ chuyên dụng hỗ trợ phân giải $ref từ xa.

Có. Cả lược đồ lẫn tài liệu đều được giữ tại chỗ. Nội dung đã dán không bao giờ được tải lên, an toàn cho các hợp đồng API nội bộ và dữ liệu nhạy cảm.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác