2013-07-29 5 views
13

Ich versuche herauszufinden, wie required auf meinem JSON-Schema-Array von Objekten festgelegt werden. Die erforderliche Eigenschaft eignet sich für ein Objekt, nicht für ein Array.Einstellung für ein JSON-Array erforderlich

Hier ist der Artikel ein Teil meines json Schema:

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

Hier ist die JSON-Array ich über schicke. Die JSON-Validierung sollte fehlschlagen, da ich in diesen Elementen keine Beschreibung übergebe.

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

Antwort

15

Ich habe es mit this validator arbeiten durch Verschachteln des Teils des Schemas für die Array-Elemente in einem Objekt mit dem Namen items. Das Schema hat jetzt zwei verschachtelte items Felder, aber das ist, weil man ein Schlüsselwort in JSONSchema ist und der andere, weil Ihr JSON hat tatsächlich ein Feld items

JSONSchema genannt:

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

Ausgang mit zwei Fehlern über fehlende Beschreibungsfelder:

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

Versuchen Sie, den obigen Code in here einzufügen, um die gleiche Ausgabe zu sehen.

4

Ich weiß, das ist ein alter Thread, aber da diese Frage von jsonschema.net verbunden ist, dachte ich, es könnte sich lohnen in chiming ...

Das Problem mit Ihrem ursprünglichen Beispiel ist, dass Sie erklären "Eigenschaften" für einen "Array" -Typ, anstatt "Elemente" für das Array zu deklarieren und dann einen "Objekt" -Typ (mit "Eigenschaften") zu deklarieren, der das Array auffüllt. Hier ist eine überarbeitete Version des ursprünglichen Schema Schnipsel:

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

Ich würde empfehlen, gegen die Verwendung des Begriffs „Produkte“ für den Namen des Feldes, um Verwirrung zu vermeiden, aber es gibt nichts mehr im Wege stehen, das zu tun ...