web-dev-qa-db-fra.com

paramètre requis sur un tableau json-schema

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"
        }
    ]
15
ipengineer

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.

21
theon

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:

7
theon

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 ...

6
Greg Stumph