2012-05-30 34 views
22

chuỗi JSON của tôi sẽ được định dạng như:Làm thế nào để viết một lược đồ JSON cho mảng đối tượng?

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":4} 
     } 
    ] 
} 

Mảng data chứa nhiều abc. Và không có loại vật thể nào khác.

Nếu count==0, data phải là một mảng trống [].

Tôi đang sử dụng https://github.com/hoxworth/json-schema để xác thực các đối tượng JSON như vậy trong Ruby.

require 'rubygems' 
require 'json-schema' 

p JSON::Validator.fully_validate('schema.json',"test.json") 

Các schema.json là:

{ 
    "type":"object", 
    "$schema": "http://json-schema.org/draft-03/schema", 
    "required":true, 
    "properties":{ 
    "count": { "type":"number", "id": "count", "required":true }, 
    "data": { "type":"array", "id": "data", "required":true, 
     "items":[ 
      { "type":"object", "required":false, "properties":{ "a": { "type":"object", "id": "a", "required":true, "properties":{ "ax": { "type":"number", "id": "ax", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "b": { "type":"object", "id": "b", "required":true, "properties":{ "bx": { "type":"number", "id": "bx", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "c": { "type":"object", "id": "c", "required":true, "properties":{ "cx": { "type":"number", "id": "cx", "required":true } } } } } 
     ] 
    } 
    } 
} 

Nhưng điều này cho test.json sẽ vượt qua xác nhận trong khi tôi cho rằng nó nên thất bại:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":2} 
     }, 
     { 
      "c": {"z":"aa"} 
     } 
    ] 
} 

Và đây là test.json sẽ thất bại, trong khi tôi giả sử nó phải vượt qua:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     } 
    ] 
} 

Dường như lược đồ sai đang xác thực rằng mảng data chứa a,b,c một lần.

Lược đồ đúng nên là gì?

+0

@Phrogz Tôi đã cập nhật câu hỏi. Bạn có thể xem ví dụ. –

Trả lời

30

Từ JSON schema spec, mục 5.5. hạng mục:

Khi giá trị thuộc tính này là một mảng của schemas và dụ
giá trị là một mảng, mỗi vị trí trong mảng dụ PHẢI phù hợp
lược đồ ở vị trí tương ứng cho mảng này. Đây là số
được gọi là nhập tuple.

Định nghĩa lược đồ của bạn yêu cầu ba phần tử đầu tiên của mảng phải chính xác là các phần tử 'a', 'b' và 'c'. Nếu items để trống, mọi thành phần mảng đều được phép. Tương tự, nếu additionalItems để trống, mọi phần tử mảng bổ sung đều được phép.

Để có được những gì bạn muốn, bạn cần phải xác định "additionalItems": false và cho items, tôi nghĩ như sau (hơi ngắn lại từ các định nghĩa của bạn) nên làm việc:

"items": { 
    "type": [ 
    {"type":"object", "properties": {"a": {"type": "object", "properties": {"ax": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"b": {"type": "object", "properties": {"bx": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"c": {"type": "object", "properties": {"cx": { "type":"number"}}}}} 
    ] 
} 
+1

điều này phù hợp với tôi, cảm ơn –

+1

Đây có phải là cách đúng để sử dụng "loại" ở đây không? Thay vào đó, giá trị của "mục" có phải là mảng không? –

+0

@Xác minh, xin lỗi vì đã mở lại điều này, nhưng giải pháp được đề xuất không hoạt động; vì vậy ví dụ tôi nên có nhiều hơn 3 đối tượng được đề xuất trong mảng 'dữ liệu' thì xác thực lược đồ không thành công ... bất kỳ ý tưởng nào để giải quyết vấn đề này? – jtimz

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