JSON Schema mô tả hình dạng mà một tài liệu phải có — có những khóa nào, giá trị kiểu gì, khóa nào bắt buộc, khoảng giá trị và mẫu chuỗi nào được chấp nhận. Trang này đối chiếu tài liệu với schema và báo mọi chỗ hai bên lệch nhau, mà không thứ nào rời khỏi trình duyệt.
Đọc một lỗi
Mỗi lỗi mang hai vị trí, và chúng trả lời hai câu hỏi khác nhau:
| Trỏ vào | Ví dụ | Trả lời | |
|---|---|---|---|
| Đường dẫn giá trị | tài liệu của bạn | items[0].price | sai cái gì |
| Đường dẫn luật | schema của bạn | /properties/items/items/properties/price/type | luật nào nói vậy |
Đường dẫn giá trị viết theo đúng cách bạn sẽ lấy giá trị đó trong code, nên items[0].price đọc
thẳng xuống tài liệu là ra. Khóa nào không phải định danh thường thì được bọc nháy — khóa có dấu
chấm bên trong hiện thành ["a.b"] chứ không âm thầm bị đọc thành hai tầng.
Đường dẫn luật là một JSON pointer trỏ vào schema, đó là cách bạn tìm ra từ khóa cần sửa khi thứ sai là schema chứ không phải tài liệu.
Bản draft lấy từ chính schema của bạn
Bộ kiểm tra đọc khóa $schema rồi áp luật của đúng draft đó. Draft 4, 6, 7, 2019-09 và 2020-12
đều được hỗ trợ, và điều này quan trọng vì các draft khác nhau thật:
exclusiveMinimumở draft 4 là một cờ boolean, từ draft 6 trở đi thành một con số riêng.itemsdạng mảng schema đổi thànhprefixItemsở 2020-12.definitionsđổi thành$defs.
Schema không có khóa $schema sẽ được kiểm theo 2020-12.
$schema trước tiên. Hai bộ kiểm tra bất đồng trên cùng một tài liệu thường là do chúng chọn draft khác nhau, chứ không phải một bên sai.Tham chiếu ra ngoài bị từ chối có chủ ý
Một $ref trỏ tới file khác hay URL sẽ không giải được. Đây không phải tính năng làm dở: cách duy
nhất để giải nó là tải nó về, mà tải về là phá vỡ lời hứa của trang này. Một bộ kiểm tra chịu tải
URL nằm trong schema của bạn là thứ có thể bị lợi dụng để lộ ra bạn làm việc với schema nào, của ai.
Tham chiếu bên trong schema thì chạy bình thường. Chuyển thứ bạn cần vào $defs rồi trỏ tới bằng
con trỏ nội bộ:
{
"$defs": { "money": { "type": "number", "minimum": 0 } },
"type": "object",
"properties": { "price": { "$ref": "#/$defs/money" } }
}
Số giữ nguyên giá trị thật
Việc kiểm tra chạy trên văn bản gốc của từng con số chứ không trên bản double đã chuyển đổi. Nhờ
vậy số nguyên 30 chữ số vẫn là integer, và vẫn so sánh đúng với minimum, maximum,
multipleOf. Đây là khác biệt thật: ở bộ kiểm tra parse sang double trước, một mã định danh dài đã
bị hỏng ngầm trước khi bất kỳ luật nào được áp, và báo cáo sẽ mô tả một giá trị bạn chưa từng gửi.
Vài lỗi hay gặp và ý nghĩa của chúng
- want string, but got number — lệch kiểu, thường là một trường số bị bọc nháy hoặc một trường chuỗi lại về dạng số. Hãy soi thứ sinh ra tài liệu, đừng soi schema.
- missing properties — thiếu một khóa
required. Nếu khóa đó thật sự là tùy chọn thì thứ cần sửa là schema. - must not have additional properties — schema đặt
additionalProperties: falsemà tài liệu mang theo khóa nó không khai báo. Hay gặp sau khi API thêm trường mới. - does not match pattern — một
patternhoặcformatđã bác giá trị. Biểu thức chính quy trong schema không tự neo hai đầu, nên khớp một phần cũng tính là khớp.
Giới hạn
Mười megabyte cho schema và mười megabyte cho tài liệu — ngưỡng của thứ một tab trình duyệt giữ được thoải mái, không phải ngưỡng của bộ kiểm tra.