2013-07-29 14 views
13

Sto cercando di capire come impostare required sul mio array json-schema di oggetti. La proprietà richiesta funziona bene su un oggetto e non su un array.impostazione richiesta su un array json-schema

qui è la parte elementi del mio 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 
    } 

Ecco l'array JSON io mando sopra. La convalida JSON dovrebbe fallire poiché non sto passando una descrizione in questi articoli.

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

risposta

15

Ho funzionato utilizzando this validator annidando la parte dello schema per gli elementi di matrice all'interno di un oggetto con il nome items. Lo schema ha ora due annidati items campi, ma che è perché uno è una parola chiave nel JSONSchema e l'altro perché il JSON in realtà ha un campo chiamato 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" 
     } 
    ] 
} 

uscita con due errori di perdere campi di descrizione:

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

Prova a incollare il precedente in here per vedere lo stesso output generato.

4

Mi rendo conto che questo è un vecchio thread, ma dal momento che la questione è legata da jsonschema.net, ho pensato che potrebbe valere la pena di rintocchi in ...

Il problema con il tuo esempio originale è che si sta dichiarando "proprietà" per un tipo "array", piuttosto che dichiarare "items" per l'array e quindi dichiarare un tipo "oggetto" (con "proprietà") che popola l'array. Ecco una versione riveduta del frammento di schema originale:

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

mi sento di raccomandare di non utilizzare il termine "elementi" per il nome della matrice, per evitare confusione, ma non c'è nulla ti impedisce di farlo ...

Problemi correlati