2017-10-09 21 views
1

je dois valider un objet JSON qui ont toujours 2 propriétés:validation de jsonschema des propriétés requises et/ou sous condition nécessaire

  • Type
  • Nom

type peut être "A", "B" ou "C",

lorsque le type est "A", la propriété "foo" est également requise et aucune propriété supplémentaire n'est autorisée.

OK:

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
} 

Non OK:

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 

lorsque le type est "B", la propriété "bar" est nécessaire et pas de propriétés supplémentaires sont autorisés. Lorsque le type est "C", la propriété "barre" est requise et éventuellement la propriété "zen" peut être présente.

OK:

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "zen": "a" 
} 

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
} 

Non OK:

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "lol": "a" 
} 

Malheureusement, la réponse exceptionnelle à cette question couvrir partiellement mon cas, mais je ne l'ai pas réussi à construire une jsonschema qui fonctionne pour moi.

modifier:

Voici ce que j'ai essayé.

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "object", 
    "properties": { 
     "type": { 
      "type": "string", 
      "enum": ["A", "B", "C"] 
     }, 
     "name": {"type": "string"}, 
     "foo": {"type": "string"}, 
     "bar": {"type": "string"}, 
     "zen": {"type": "string"}, 
    }, 
    "anyOf": [ 
     { 
      "properties": {"type": {"enum": ["A"]}}, 
      "required": ["foo"], 
     }, 
     { 
      "properties": {"type": {"enum": ["B"]}}, 
      "required": ["bar"], 
     }, 
     { 
      "properties": {"type": {"enum": ["C"]}}, 
      "required": ["bar"], 
     }, 
    ] 
} 

Mon problème est que la mise en le champ « additionalProperties » false à l'intérieur des objets « ANYOF » ne me donne pas le résultat escompté.

par exemple les JSON suivantes passent la validation, malgré qu'il a la propriété supplémentaire « lol »

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 
+0

J'ai mis à jour mon post pour inclure l'exemple que j'ai essayé et la raison pour laquelle cette solution ne fonctionne pas pour moi – cunfusu

Répondre

0

JSON schéma est un système de contrainte où les contraintes de chaque sous-schéma sont évalués séparément. Cela signifie que "additionalProperties" peut seulement "voir" les "propriétés" ou "patternProperties" dans le même objet de schéma immédiat.

En outre, il ne peut pas "voir" les propriétés basées sur "required", seulement sur "properties" et "patternProperties". Pour autant que je sache, si vous définissiez "additionalProperties": false à l'intérieur de chaque branche du anyOf, rien de tout cela ne devrait fonctionner car la seule propriété autorisée serait "type". Si vous avez fait cela et que vous autorisez des propriétés autres que "type", alors je voudrais savoir quelle implémentation vous utilisez.

+0

donc la seule façon d'implémenter le schéma rigide dont j'ai besoin est d'utiliser anyOf avec la liste des schémas qui J'ai besoin, je voulais réutiliser certaines propriétés mais semble que ce n'est pas possible. – cunfusu

+0

Dans draft-04, oui, c'est correct. –

+0

Dans draft-06, vous pouvez faire une réutilisation avec 'propertyNames', bien que ce ne soit pas incroyablement concis. –