web-dev-qa-db-fra.com

Schéma JSON correct pour un tableau d'éléments de types différents

J'ai un tableau non ordonné d'éléments JSON. Selon la spécification http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.5 le schéma json ci-dessous ne sera valide que si les objets du tableau apparaissent DANS CET ORDRE . Je ne veux pas spécifier un ordre, mais simplement valider les objets dans le tableau, indépendamment de l'ordre ou du nombre d'objets. D'après les spécifications, je n'arrive pas à comprendre comment cela est fait.

"transactions" : {
    "type" : "array",
    "items" : [
        {
            "type" : "object",
            "properties" : {
                "type" : {
                    "type" : "string",
                    "enum" : ["BUILD", "REASSIGN"]
                }
            }
        },
        {
            "type" : "object",
            "properties" : {
                "type" : {
                    "type" : "string",
                    "enum" : ["BREAK"]
                }
            }
        }
    ]
}
20
deepwinter

J'ai posé la même question sur le groupe google du schéma JSON, et la réponse a été fournie rapidement. L'utilisateur fge a demandé que je poste sa réponse ici:

Bonjour, 

La spécification actuelle est brouillon v4, pas brouillon v3. Plus spécifiquement, la spécification de validation est ici: 

http://tools.ietf.org/html/draft-fge-json-schema-validation-00

Le site Web n'est pas à jour, je ne sais pas pourquoi ... Je vais envoyer un extrait demande. 

Avec Draft v4, vous pouvez utiliser ceci: 

{
    "type": "array",
    "items": {
        "oneOf": [
            {"first": [ "schema", "here" ] }, 
            {"other": [ "schema": "here" ] }
        ]
    }  
}

Par exemple, ceci est un schéma pour un tableau où les éléments peuvent être soit des chaînes ou des entiers (cela peut être écrit d'une manière plus simple): 

{
    "type": "array",
    "items": {
        "oneOf": [
            {"type": "string"},
            {"type": "integer"}
        ]
    }
}

C'est la bonne réponse. Mon schéma corrigé inclut maintenant:

"transactions" : {
    "type" : "array",
    "items" : {
        "oneOf" : [
            {
                "type" : "object",
                "properties" : {
                    "type" : {
                        "type" : "string",
                        "enum" : ["BUILD", "REASSIGN"]
                    }
                }
            },
            {
               "type" : "object",
               "properties" : {
                 "type" : {
                   "type" : "string",
                   "enum" : ["BREAK"]
                  }
               }
            }
        ]
    }
}
38
deepwinter

Cela fait aussi un moment que je me penche sur la question. Mais n'ont pas été en mesure de trouver une solution de travail. Cela fonctionne bien si vous avez un seul schéma, par exemple. 

"transactions" : {
          "type" : "array",
          "items" : 
          {
            "type" : "object",
            "properties" : {
              "type" : {
                "type" : "string",
                "enum" : ["BREAK"]
              },
          }
}

Ensuite, vous sautez simplement les crochets de tableau et utilisez un objet. Cependant, si vous voulez faire ce que vous faites, il ne semble pas y avoir de réponse solide. C'est la seule chose que j'ai trouvée jusqu'ici: http://the-long-dark-tech-time.blogspot.se/2012/12/using-json-schema-with-array-of-mixed .html

3
Jonas Kac

Pour tous ceux qui sont coincés avec le schéma de brouillon 3. Il existe un mot clé "Type" équivalent à "anyOf" dans le brouillon 4:

Afin que vous puissiez utiliser

{
    "fooBar" : {
        "type" : "array",
        "items" : {
            "type" : [{
                    "type" : "object",
                    "properties" : {
                        "foo" : {                           
                            "type" : "string"
                        }
                    }
                }, {
                    "type" : "object",
                    "properties" : {
                        "bar" : {
                            "type" : "string"
                        }
                    }
                }
            ]
        }
    }
}
1
Vdex

En réponse à l'utilisateur Vdex: ce n'est pas équivalent, ce que vous avez écrit signifie que les éléments du tableau se produisent dans cet ordre particulier dans le tableau. 

Sous réserve d'une implémentation correcte, si vous utilisez ce validateur de schéma .

Avec ce schéma:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "array",
  "items": [
    {
      "type": "boolean"
    },
    {
      "type": "number"
    },
    {
      "type": "string"
    }
  ]
}

Ce JSON sera validé:

[
  true,
  5,
  "a",
  "6",
  "a",
  5.2
]

Mais pas celui-ci:

[
  5,
  true,
  "a",
  "6",
  "a",
  5.2
]

Ainsi, l'objectif est totalement différent des mots clés tels que "oneOf". 

1
Cwellan