J'essaie de comprendre comment définir required
sur mon tableau d'objets json-schema. La propriété required
fonctionne très bien sur un objet mais pas sur un tableau.
Voici les éléments de mon schéma 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
}
Voici le tableau json que j'envoie. La validation json devrait échouer car je ne passe pas de description dans ces éléments.
"items": [
{
"item_id": 1,
"quantity": 3,
"price": 30,
"title": "item1 new name"
},
{
"item_id": 1,
"quantity": 16,
"price": 30,
"title": "Test Two"
}
]
Je l'ai fait fonctionner en utilisant ce validateur en imbriquant la partie du schéma pour les éléments du tableau à l'intérieur d'un objet avec le nom items
. Le schéma a maintenant deux champs items
imbriqués, mais c'est parce que l'un est un mot-clé dans JSONSchema et l'autre parce que votre JSON a en fait un champ appelé 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"
}
]
}
Sortie avec deux erreurs sur les champs de description manquants:
[ {
"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" ]
} ]
Essayez de coller ce qui précède dans ici pour voir la même sortie générée.
Peut-être que votre validateur ne prend en charge que JSONSchema v3?
La façon dont required
fonctionne a changé entre la v3 et la v4:
required
est un booléen: http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.7required
est un tableau de chaînes (comme dans votre exemple): http://tools.ietf.org/html/draft-fge-json-schema-validation-00#section- 5.4.Je me rends compte que c'est un vieux fil de discussion, mais comme cette question est liée à jsonschema.net, je pensais que cela valait la peine de sonner ...
Le problème avec votre exemple d'origine est que vous déclarez des "propriétés" pour un type "tableau", plutôt que des "éléments" pour le tableau, puis déclarez un type "objet" (avec "propriétés") qui remplit le tableau . Voici une version révisée de l'extrait de schéma d'origine:
"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
}
}
Je déconseille d'utiliser le terme "éléments" pour le nom du tableau, pour éviter toute confusion, mais rien ne vous empêche de le faire ...