2013-07-29 26 views
13

Tôi đang cố gắng tìm ra cách đặt required trên mảng đối tượng json-schema của đối tượng. Thuộc tính bắt buộc hoạt động tốt trên một đối tượng không phải là một mảng.trên một mảng sơ đồ json

Dưới đây là các mặt hàng phần của giản đồ json tôi:

 "items": { 
     "type": "array", 
     "properties": { 
      "item_id": {"type" : "number"}, 
      "quantity": {"type": "number"}, 
      "price": {"type" : "decimal"}, 
      "title": {"type": "string"}, 
      "description": {"type": "string"} 
     }, 
     "required": ["item_id","quantity","price","title","description"], 
     "additionalProperties" : false 
    } 

Dưới đây là mảng json Tôi gửi qua. Việc xác nhận json sẽ thất bại vì tôi không chuyển mô tả trong các mục này.

 "items": [ 
     { 
      "item_id": 1, 
      "quantity": 3, 
      "price": 30, 
      "title": "item1 new name" 
     }, 
     { 
      "item_id": 1, 
      "quantity": 16, 
      "price": 30, 
      "title": "Test Two" 
     } 
    ] 

Trả lời

15

Tôi đã nhận nó hoạt động bằng cách sử dụng this validator bằng cách lồng một phần lược đồ cho các phần tử mảng bên trong một đối tượng có tên items. Giản đồ hiện có hai lồng nhau items lĩnh vực, nhưng đó là bởi vì một là một từ khóa trong JSONSchema và người kia vì JSON của bạn thực sự có một trường gọi là items

JSONSchema:

{ 
    "type":"object", 
    "properties":{ 
     "items":{ 
     "type":"array", 
     "items":{ 
      "properties":{ 
       "item_id":{ 
        "type":"number" 
       }, 
       "quantity":{ 
        "type":"number" 
       }, 
       "price":{ 
        "type":"number" 
       }, 
       "title":{ 
        "type":"string" 
       }, 
       "description":{ 
        "type":"string" 
       } 
      }, 
      "required":[ 
       "item_id", 
       "quantity", 
       "price", 
       "title", 
       "description" 
      ], 
      "additionalProperties":false 
     } 
     } 
    } 
} 

JSON:

{ 
    "items":[ 
     { 
     "item_id":1, 
     "quantity":3, 
     "price":30, 
     "title":"item1 new name" 
     }, 
     { 
     "item_id":1, 
     "quantity":16, 
     "price":30, 
     "title":"Test Two" 
     } 
    ] 
} 

Đầu ra có hai lỗi về trường mô tả bị thiếu:

[ { 
    "level" : "error", 
    "schema" : { 
    "loadingURI" : "#", 
    "pointer" : "/properties/items/items" 
    }, 
    "instance" : { 
    "pointer" : "/items/0" 
    }, 
    "domain" : "validation", 
    "keyword" : "required", 
    "message" : "missing required property(ies)", 
    "required" : [ "description", "item_id", "price", "quantity", "title" ], 
    "missing" : [ "description" ] 
}, { 
    "level" : "error", 
    "schema" : { 
    "loadingURI" : "#", 
    "pointer" : "/properties/items/items" 
    }, 
    "instance" : { 
    "pointer" : "/items/1" 
    }, 
    "domain" : "validation", 
    "keyword" : "required", 
    "message" : "missing required property(ies)", 
    "required" : [ "description", "item_id", "price", "quantity", "title" ], 
    "missing" : [ "description" ] 
} ] 

Thử dán phần trên vào here để xem cùng một đầu ra được tạo.

4

Tôi nhận ra đây là một chủ đề cũ, nhưng kể từ khi câu hỏi này được liên kết từ jsonschema.net, tôi nghĩ nó có thể là giá trị chiming trong ...

Vấn đề với ví dụ ban đầu của bạn là bạn đang khai báo "các thuộc tính" cho một loại "mảng", thay vì khai báo "các mục" cho mảng đó, và sau đó khai báo một kiểu "đối tượng" (với "các thuộc tính") để điền vào mảng đó. Dưới đây là một phiên bản sửa đổi của đoạn schema gốc:

"items": { 
    "type": "array", 
    "items": { 
     "type": "object", 
     "properties": { 
      "item_id": {"type" : "number"}, 
      "quantity": {"type": "number"}, 
      "price": {"type" : "decimal"}, 
      "title": {"type": "string"}, 
      "description": {"type": "string"} 
     }, 
     "required": ["item_id","quantity","price","title","description"], 
     "additionalProperties" : false 
    } 
} 

tôi muốn giới thiệu với cách sử dụng "mặt hàng" hạn cho tên của mảng, để tránh nhầm lẫn, nhưng có gì ngăn cản bạn làm đó là ...