web-dev-qa-db-fra.com

Schéma JSON avec des noms de propriété inconnus

Je souhaite avoir un schéma JSON avec des noms de propriété inconnus dans un tableau d'objets. Un bon exemple est la méta-donnée d’une page Web: 

      "meta": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "unknown-attribute-1": {
              "type": "string"
            },
            "unknown-attribute-2": {
              "type": "string"
            },
            ...
          }
        }
      }

Des idées s'il vous plaît, ou un autre moyen d'atteindre les mêmes?

17
Thami Bouchnafa

Utilisez patternProperties au lieu de properties. Dans l'exemple ci-dessous, la correspondance de modèle regex .* accepte n'importe quel nom de propriété et j'autorise les types string ou null uniquement à l'aide de "additionalProperties": false.

  "patternProperties": {
    "^.*$": {
      "anyOf": [
        {"type": "string"},
        {"type": "null"}
      ]
    }
  },
  "additionalProperties": false
28
pink spikyhairman

Vous pouvez créer des contraintes sur les propriétés non définies explicitement. Le schéma suivant impose "méta" à un tableau d'objets dont les propriétés sont de type chaîne:

{
    "properties" : {
        "meta" : {
            "type" : "array",
            "items" : {
                "type" : "object",
                "additionalProperties" : {
                    "type" : "string"
                }
            }
        }
    }
}

Si vous souhaitez simplement avoir un tableau de chaînes, vous pouvez utiliser le schéma suivant:

{
    "properties" : {
        "meta" : {
            "type" : "array",
            "items" : {
                "type" : "string"
            }
        }
    }
}
6
jruizaranguren

La solution de @jruizaranguren fonctionne pour moi. Même si je suis le même qui définit le schéma, j’ai choisi une autre solution 

"meta": {
        "type": "array",
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            }
          }
        }
      }

J'ai converti l'objet en un tableau d'objets nom-valeur . Exemple d'un fichier JSON valide: 

"meta": [
    [
      {
        "name": "http-equiv",
        "value": "Content-Type"
      },
      {
        "name": "content",
        "value": "text/html; charset=UTF-8"
      }
    ],
    [
      {
        "name": "name",
        "value": "author"
      },
      {
        "name": "content",
        "value": "Astrid Florence Cassing"
      }
    ]
  ]
1
Thami Bouchnafa