Trong những gì tôi có thể tìm hiểu về việc sử dụng lược đồ JSON, có vẻ là một sự nhầm lẫn khó hiểu (hoặc ít nhất là thiếu sự phân biệt giữa) nhiệm vụ mô tả dữ liệu hợp lệ, xác nhận hợp lệ dữ liệu được lưu trữ và xác thực dữ liệu đầu vào.Giản đồ JSON cho mô tả dữ liệu so với xác thực dữ liệu và xác thực đầu vào
Một ví dụ điển hình trông giống như:
var schema = {
type: 'object',
properties: {
id: { type: 'integer', required: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
này hoạt động tốt để mô tả những dữ liệu có giá trị trong một lưu trữ dữ liệu nên như thế nào, và do đó để phê chuẩn nó (sau này không phải là terribly hữu ích-nếu nó trong một cửa hàng phải hợp lệ):
var storedData = {
id: 123,
name: 'orange',
description: 'delicious'
};
Nó không hoạt động tốt để xác thực đầu vào. id
rất có khả năng để ứng dụng tạo và không cho người dùng cung cấp như một phần của đầu vào. Các đầu vào sau đây không xác nhận vì nó thiếu id
mà giản đồ tuyên bố là required
:
var inputData = {
name: 'orange',
description: 'delicious'
};
Fine, người ta có thể nói, giản đồ không có nghĩa là xác nhận đầu vào trực tiếp, xác nhận chỉ xảy ra sau khi ứng dụng đã thêm một số id
và dữ liệu là những gì được lưu trữ.
Nếu giản đồ không có nghĩa là xác thực đầu vào trực tiếp, thì điểm 1 của trình xác thực JavaScript đang chạy trong trình duyệt, có lẽ là được nhập trực tiếp và 2) điểm rõ ràng là hướng đầu vào readonly
tính năng lược đồ trong spec?
Mặt đất bị rung khi suy nghĩ về các thuộc tính có thể được đặt một lần nhưng không được cập nhật (như tên người dùng), cũng như các cấp truy cập khác nhau (ví dụ: quản trị viên và chủ sở hữu của màu cam sẽ có thể thay đổi description
, trong khi cho những người dùng khác, nó nên ở lại readonly
).
Thực hành tốt nhất (hoặc ít nhất là làm việc) để giải quyết vấn đề này là gì? Một lược đồ khác nhau cho từng trường hợp sử dụng, như dưới đây?
var baseSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
var ownerUpdateSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: false, readonly: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
var userUpdateSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: false, readonly: true },
name: { type: 'string', required: false, readonly: true },
description: { type: 'string', required: false, readonly: true }
}
};
Hoặc cái gì khác?
Nếu bạn 'chỉ mô tả dữ liệu' thì sẽ rất hữu ích khi chỉ định id đó là bắt buộc. Nếu tôi đang tiêu thụ dữ liệu của bạn, sau đó tôi biết rằng tôi có thể dựa vào lĩnh vực này, nếu không tôi cần phải tìm một cái gì đó khác để sử dụng như một định danh. –