2013-07-29 103 views
13

我想弄清楚如何在我的json-schema數組對象上設置required。所需的屬性在一個對象上正常工作,而不是一個數組。json-schema數組所需的設置

這裏是我的JSON模式的項目部分:

 "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 
    } 

這裏是JSON數組我送過來。 json驗證應該失敗,因爲我沒有在這些項目中傳遞說明。

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

回答

15

我使用this validator通過將名稱爲items的對象內的數組元素的模式部分嵌套來使用它。該模式現在有兩個嵌套items領域,但就是因爲一個是在JSONSchema一個關鍵字,另外因爲你的JSON實際上有一個名爲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" 
     } 
    ] 
} 

輸出與失蹤描述域兩個錯誤:

[ { 
    "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" ] 
} ] 

嘗試粘貼上面的here以查看生成的相同輸出。

4

我意識到這是一個古老的線程,但由於這個問題是來自jsonschema.net聯繫,我想這可能是值得插嘴......

與你原來的例子的問題是,你聲明「數組」屬性,而不是爲數組聲明「條目」,然後聲明一個填充數組的「對象」類型(使用「屬性」)。這裏的原始模式片斷的修訂版:

"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 
    } 
} 

我會建議不要使用術語「項目」爲數組的名稱,以避免混淆,但沒有什麼從這樣做,阻止你...