2013-02-24 36 views
7

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?

Trả lời

1

Side-lưu ý: "yêu cầu" bây giờ là một mảng trong yếu tố phụ huynh trong v4, và "chỉ đọc" được viết hoa khác nhau - Tôi sẽ sử dụng hình thức mà các ví dụ của tôi

Tôi đồng ý rằng việc chứng thực dữ liệu được lưu trữ là khá hiếm. Và nếu bạn chỉ mô tả dữ liệu, thì bạn không cần chỉ định rằng "id" là bắt buộc.

Một điều nữa cần nói là tất cả các lược đồ này đều có URI mà tại đó chúng có thể được tham chiếu (ví dụ: /schemas/baseSchema). Vào thời điểm đó, bạn có thể mở rộng các lược đồ để làm cho "id" cần thiết trong một số trong số họ:

var ownerInputSchema = { 
    type: 'object', 
    properties: { 
     id: {type: 'integer', readOnly: true}, 
     name: {type: 'string'}, 
     description: {type: 'string'} 
    }, 
    required: ['name'] 
}; 

var userInputSchema = { 
    allOf: [{"$ref": "/schemas/inputSchema"}], 
    properties: { 
     name: {readOnly: true} 
    } 
}; 

var storedSchema = { 
    allOf: [{"$ref": "/schemas/inputSchema"}], 
    required: ["id"] 
} 

Mặc dù, như tôi đã nói ở trên, tôi không chắc chắn storedSchema cần thiết. Điều bạn kết thúc là lược đồ "chủ sở hữu" mô tả định dạng dữ liệu (như được phân phối và có thể chỉnh sửa bởi chủ sở hữu dữ liệu) và bạn có giản đồ phụ mở rộng để khai báo readOnly trên thuộc tính bổ sung.

+0

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. –

0

Vâng, tôi nghĩ rằng mục đích của Json-Schema được xác định rõ ràng hơn trong v4.Mục tiêu là hỗ trợ bạn trong việc xác nhận cấu trúc dữ liệu (cho dù nó sẽ được lưu trữ, nó đã được gửi cho bạn qua dây dẫn, hoặc bạn đang tạo ra một cách tương tác).

readOnly không phải là thuộc tính xác thực Json-Schema vì nó không có ràng buộc xác thực. Trong Json-Schema v4 readOnly là một phần của định nghĩa siêu lược đồ. Nó có thể được sử dụng để thể hiện rằng bạn không thể thay đổi thuộc tính này trong một yêu cầu POST.

Sơ đồ Json không xác định cách bạn nên thực hiện tương tác với người dùng, nếu bạn cho phép dữ liệu "xấu" tạm thời hoặc nếu bất kỳ lỗi nào phải được sửa trước khi bạn có thể thêm nhiều dữ liệu hơn vào hệ thống. Đây là tùy thuộc vào bạn.

Các vấn đề liên quan