Trình tạo JSON Schema

Dán một hoặc nhiều mẫu JSON, trình tạo sẽ suy luận ra một JSON Schema mà bạn có thể dùng để xác thực các payload mới. Công cụ phát hiện kiểu, đánh dấu trường là bắt buộc khi trường đó xuất hiện trong mọi mẫu, suy luận enum khi giá trị lấy từ một tập đóng nhỏ, và tạo ra kết quả tuân thủ JSON Schema draft 2020-12.

Cách tạo JSON Schema

  1. 1

    Dán tài liệu mẫu

    Một hoặc nhiều payload thực tế; càng đa dạng thì schema được suy luận càng chính xác.

  2. 2

    Chọn draft

    draft 2020-12 (hiện hành), draft 07 (được hỗ trợ rộng rãi) hoặc draft 04 (cho OpenAPI cũ).

  3. 3

    Điều chỉnh suy luận

    Bật/tắt suy luận enum, chiến lược trường bắt buộc (giao hoặc hợp), và có đánh dấu tất cả trường là `required` hay không khi chỉ cung cấp một mẫu.

  4. 4

    Tạo

    Schema được xuất ra cùng với `$schema`, `title`, `type`, `properties`, và `$ref` lồng nhau cho các đối tượng con lặp lại.

Những gì suy luận làm tốt

  • Kiểu: string, number, integer, boolean, null, array, object.
  • Khả năng nhận giá trị null: một trường có giá trị null trong một mẫu và là chuỗi trong mẫu khác sẽ trở thành ["string", "null"].
  • Phần tử mảng: mảng đồng nhất tạo ra một schema items duy nhất; mảng không đồng nhất tạo ra prefixItems.
  • Enum: nếu tất cả các giá trị quan sát được đều thuộc một tập nhỏ (có thể cấu hình, mặc định 10 giá trị khác nhau), hệ thống sẽ xuất ra enum.
  • Bắt buộc: với nhiều mẫu, giao của các khóa trở thành required; với một mẫu, tất cả các khóa đều bắt buộc trừ khi bạn chọn bỏ qua.
  • Định dạng: các chuỗi khớp với ngày ISO-8601, email hoặc URI sẽ được suy luận format.

Những gì suy luận không thể biết

  • Ý định so với ví dụ: mẫu age: 25 suy luận ra type: integer, nhưng không thể biết rằng bạn cũng chấp nhận null. Hãy cung cấp nhiều mẫu bao quát các trường hợp biên.
  • Ràng buộc: minLength, maximum, pattern, bạn phải tự thêm chúng. Suy luận không đoán giới hạn từ mẫu.
  • Logic nghiệp vụ: “chỉ đúng một trong ba trường này được thiết lập” cần dùng oneOf, không thể suy luận.
  • Tham chiếu: trình tạo xuất ra một schema phẳng. Nếu bạn muốn tách các cấu trúc lặp lại vào $defs, hãy làm việc đó sau khi tạo.

Ví dụ đầu ra

Từ một mẫu duy nhất:

{ "name": "Alice", "age": 30, "tags": ["admin", "user"] }

Schema được suy luận (draft 2020-12):

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer" },
    "tags": { "type": "array", "items": { "type": "string" } }
  },
  "required": ["name", "age", "tags"]
}

Các lỗi thường gặp

  • Suy luận từ một mẫu duy nhất. Schema sẽ bị overfit, mọi trường đều trở nên bắt buộc, không chấp nhận null. Luôn cung cấp ít nhất 5–10 mẫu đa dạng.
  • Dùng integer trong khi bạn muốn number. Nếu bất kỳ mẫu nào có số thập phân, kiểu được suy luận sẽ là number; nếu tất cả đều là số nguyên, kiểu sẽ là integer. Với các trường có thể thuộc cả hai kiểu, hãy đưa vào một mẫu có số thập phân.
  • Quên các trường tùy chọn. Một trường xuất hiện trong 4 trên 5 mẫu nhưng thiếu ở 1 mẫu sẽ trở thành tùy chọn, đúng như dự định. Nếu cả 5 mẫu tình cờ đều có trường đó, schema sẽ đánh dấu nó là bắt buộc dù thực tế nó chỉ là tùy chọn trong API của bạn.

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

Càng nhiều càng tốt, nhưng thường 5–10 mẫu đa dạng là đủ để tạo ra một schema hợp lý. Với một mẫu duy nhất, mọi trường đều trở nên bắt buộc và không thể suy luận khả năng nhận giá trị null, vì vậy hãy luôn cung cấp nhiều biến thể nếu có thể.

Mặc định là draft 2020-12. draft 07 và 04 có sẵn để tương thích với OpenAPI 3.0 (vốn dùng một tập con của draft 05/07).

Không. Suy luận ràng buộc từ mẫu sẽ khiến schema bị overfit. Hãy thêm minLength, maximum, pattern v.v. một cách thủ công sau khi tạo, dựa trên các quy tắc nghiệp vụ của bạn.

Có. Nếu bạn dán một mảng JSON, trình tạo sẽ xem mỗi phần tử là một mẫu riêng và tạo ra một schema mô tả từng phần tử, không phải mảng bên ngoài. Hãy bật tùy chọn “xử lý như vùng chứa mảng” nếu bạn muốn lấy hình dạng của chính mảng bên ngoài.

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