Trình Tạo JSON Schema

Dán JSON để tự động tạo một JSON Schema.

Không có dữ liệu nào rời khỏi thiết bị của bạn

Cách sử dụng

  1. Dán một đối tượng hoặc một mảng JSON vào khu vực nhập.
  2. Kích hoạt các tùy chọn: bao gồm các mảng «required» hoặc các «examples» từ các giá trị của bạn.
  3. Nhấp Tạo schema để tạo một JSON Schema (Draft 2020-12).
  4. Sao chép hoặc tải xuống schema được tạo.

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

Phiên bản nào của JSON Schema được tạo?

Bộ tạo sản xuất JSON Schema Draft 2020-12 (https://json-schema.org/draft/2020-12/schema), bản nháp ổn định mới nhất.

Nó có xử lý các đối tượng và các mảng được lồng nhau không?

Có. Bộ tạo xử lý đệ quy các đối tượng và các mảng được lồng nhau. Đối với các mảng, nó suy ra schema từ phần tử đầu tiên.

Tôi có thể chỉnh sửa schema được tạo không?

Đầu ra là một điểm khởi đầu. Bạn có thể muốn thêm các ràng buộc như minLength, minimum, pattern hoặc enum tùy theo nhu cầu của bạn.

JSON Schema Dùng Để Làm Gì

JSON Schema là một cách khai báo để mô tả một tài liệu JSON nên trông như thế nào: nó có những thuộc tính gì, các thuộc tính đó giữ kiểu nào, cái gì bắt buộc và cái gì tùy chọn, và những giá trị nào hợp lệ. Đó là tương đương trong thế giới JSON của XSD đối với XML hay một định nghĩa bảng cơ sở dữ liệu. Dự án chính thức nằm ở json-schema.org.

Nơi bạn sẽ gặp nó trong thực tế:

Các Bản Nháp Bạn Sẽ Thấy Trong Thực Tế

Đặc tả JSON Schema đã được công bố như một loạt bản nháp. Bản nháp ổn định hiện tại là 2020-12 (theo trang đặc tả chính thức: "The current version is 2020-12"). Các bản nháp bạn có thể gặp:

Khi nghi ngờ, hãy chọn bản nháp phù hợp với trình kiểm chứng của bạn. AJV (trình kiểm chứng JavaScript phổ biến nhất) hỗ trợ Draft 04, 06, 07, 2019-09, và 2020-12 với opt-in tường minh. jsonschema trong Python cũng vậy. Nếu bạn không biết người tiêu thụ ở dưới muốn gì, 2020-12 là mặc định an toàn cho công việc mới.

Các Kiểu Tích Hợp

JSON Schema mô tả bảy kiểu cơ bản tương ứng với các loại giá trị của JSON:

kiểuGiá trị JSONTừ khóa phổ biến
string"hello"minLength, maxLength, pattern, format
number42, 3.14minimum, maximum, exclusiveMinimum, multipleOf
integer42Tập con của number; không có thành phần thập phân.
booleantrue / falseKhông có ràng buộc bổ sung.
nullnullKiểu riêng biệt; tường minh khi null là hợp lệ.
array[…]items, minItems, maxItems, uniqueItems
object{…}properties, required, additionalProperties

Các từ khóa ghép cho phép bạn pha trộn-kết hợp: oneOf (chính xác một), anyOf (ít nhất một), allOf (tất cả), not (đảo ngược). Cộng thêm enum cho một danh sách hữu hạn các giá trị được phép và const cho một giá trị cố định duy nhất.

Một Lược đồ Tự Sinh Có Thể và Không Thể Cho Bạn Biết Điều Gì

Suy luận một lược đồ từ một ví dụ JSON duy nhất là mạnh nhưng có giới hạn. Trình sinh có thể phát hiện:

Không thể phát hiện:

Hãy coi đầu ra như một điểm bắt đầu đã hoàn tất 70%. Những bổ sung có giá trị (trường nào thực sự bắt buộc, định dạng chuỗi nào áp dụng, khoảng giá trị nào được phép, ý nghĩa của từng trường) là bước hiệu chỉnh thủ công của con người.

Hai Cạm Bẫy Tinh Tế Đáng Biết

JSON Schema so với Zod / Joi / Yup so với kiểu TypeScript

Nhiều công nghệ chồng lấn với vai trò của JSON Schema; mỗi cái có điểm mạnh riêng:

Nếu lược đồ của bạn cần được tiêu thụ bởi nhiều ngôn ngữ hoặc nhiều công cụ (IDE, tooling OpenAPI, trình sinh mã), JSON Schema là nơi phù hợp. Nếu bạn ở trong một ngôn ngữ duy nhất, lựa chọn native của ngôn ngữ đó thường viết dễ chịu hơn.

Trường Hợp Sử Dụng Phổ Biến

Sai Lầm Thường Gặp

  1. Coi lược đồ tự sinh như spec cuối cùng. Đó chỉ là điểm khởi đầu. Hãy thêm gợi ý định dạng, đánh dấu các trường thật sự tùy chọn, thêm tài liệu, đặt khoảng giá trị.
  2. Thiếu khai báo $schema. Các trình kiểm chứng dùng nó để biết áp dụng bản nháp nào. Hãy luôn đặt ở đầu lược đồ.
  3. Coi required như một thuộc tính của từng property. Khác với XSD hay lược đồ Mongoose, required trong JSON Schema là một mảng ở cấp đối tượng cha liệt kê tên các property bắt buộc.
  4. Quên additionalProperties: false khi bạn muốn kiểm chứng nghiêm ngặt. Mặc định là true, nghĩa là các khóa lạ được im lặng cho phép.
  5. Nhầm enum với examples. enum = danh sách giá trị được phép (kiểm chứng). examples = giá trị mẫu chỉ để dùng làm tài liệu (không ảnh hưởng kiểm chứng).
  6. Giả định rằng format được cưỡng chế. Theo mặc định trong Draft 2020-12 nó là chú thích, không phải khẳng định; regex email của bạn sẽ không chạy trừ khi bạn chủ động bật.
  7. Suy luận tính tùy chọn từ một ví dụ duy nhất. Mỗi khóa trong ví dụ của bạn trở thành bắt buộc theo mặc định. Spec thật hầu như luôn có trường tùy chọn; hãy gỡ chúng khỏi mảng required như một phần của bước hiệu chỉnh.

Thêm Câu Hỏi Thường Gặp

Lược đồ có hoạt động với OpenAPI 3.1 không?

Có. OpenAPI 3.1 (phát hành tháng 2 năm 2021) đã đồng bộ ngôn ngữ lược đồ hoàn toàn với JSON Schema Draft 2020-12, đó chính là thứ trình sinh này phát ra. Hãy thả lược đồ vào components.schemas trong tài liệu OpenAPI của bạn và tham chiếu qua $ref. OpenAPI 3.0 cũ hơn dùng một tập con trước đó; bạn có thể cần điều chỉnh nếu nhắm tới 3.0.

Tôi có thể sinh kiểu trong ngôn ngữ của mình từ lược đồ này không?

Có. quicktype sinh TypeScript, Go, Python, Java, C#, Swift, Kotlin, Rust, Elm và nhiều ngôn ngữ khác từ một JSON Schema. json-schema-to-typescript là một lựa chọn dành riêng cho JS. Hầu hết các ngôn ngữ hiện đại có ít nhất một công cụ chuyển từ lược đồ sang kiểu; lược đồ được sinh ra hoạt động như đầu vào cho tất cả.

Khác biệt giữa $defsdefinitions là gì?

Cả hai đều là nơi đặt các sub-schema có thể tái dùng mà bạn có thể $ref ở nơi khác trong tài liệu. definitions là tên kế thừa, dùng trong Draft 04, 06, và 07. $defs là tên hiện hành, được giới thiệu trong Draft 2019-09 và tiếp tục trong 2020-12. Tương đương về mặt chức năng, nhưng hãy dùng $defs cho công việc mới.

JSON của tôi có được gửi đi đâu không?

Không. Việc sinh lược đồ chạy hoàn toàn trong trình duyệt của bạn. JSON được dán vào được phân tích cục bộ, duyệt qua và phát ra dưới dạng lược đồ trong textarea đầu ra. Không có gì được tải lên máy chủ, ghi log, hay giữ lại sau khi bạn đóng tab. Điều này quan trọng vì ví dụ JSON thường chứa dữ liệu thật (hồ sơ khách hàng, phản hồi API nội bộ, thông tin nhân viên) mà bạn không muốn chảy qua bên thứ ba.

Tại sao lược đồ mảng của tôi chỉ mô tả phần tử đầu tiên?

Suy luận từ một ví dụ duy nhất coi mảng là đồng nhất: nó nhìn phần tử đầu tiên và cho rằng phần còn lại cũng vậy. Nếu mảng thật của bạn có thể giữ các hình dạng khác nhau, bạn sẽ cần viết items dưới dạng { "oneOf": [...] } bằng tay. Hoặc chạy trình sinh trên mỗi biến thể riêng biệt và kết hợp các lược đồ.

Tôi có nên dùng trình sinh hay không, hay viết lược đồ bằng tay?

Với một lược đồ nhỏ mà bạn kiểm soát từ đầu đến cuối, viết bằng tay dạy bạn spec nhanh hơn. Với một phản hồi API lớn có hàng chục đối tượng lồng nhau, sinh giúp bạn có bản nháp trong vài giây và bạn dành thời gian tiết kiệm được để hiệu chỉnh ràng buộc, mô tả và mảng required. Hầu hết lập trình viên thực tế làm cả hai: sinh, rồi hiệu chỉnh.

Công cụ liên quan

Công cụ Định Dạng & Xác Thực JSON Trực Tuyến Miễn Phí So Sánh JSON Trình Chuyển Đổi JSON Sang YAML