2011-02-18 1 views
6

J'ai écrit des schémas JSON simples mais j'ai rencontré un appel d'entrée API qui est un peu plus complexe. J'ai une route fin reposante qui peut prendre 3 très différents types de JSON:Écrire des schémas JSON plus complexes qui ont des dépendances sur d'autres clés

localhost/foo

peut prendre:

{ "type": "ice_cream", "cône": "gaufres" ...}

ou

{ "type": "hot_dog", "petit pain": "blé" ...}

Si la clé "de type" contient "ice_cream", je ne jamais envie de voir la clé "cône "et non la clé" chignon ". Similairement, si "type" contient "hot_dog", je veux seulement voir "bun" et non "cone". Je sais que je peux faire correspondre le modèle pour m'assurer que je vois seulement le type "ice_cream" ou le type "hot_dog", mais je ne sais pas comment forcer l'exigence de certains autres champs si cette clé est définie sur cette valeur. Je vois qu'il y a un champ de schéma json appelé "dependency" mais je n'ai pas trouvé de bons exemples sur la façon de l'utiliser.

BTW, je ne suis pas sûr si cette entrée JSON est de bonne forme (surcharger le type de structure JSON qu'il prend, effectivement), mais je n'ai pas la possibilité de changer l'API.

+0

Je sais que c'est une vieille question, mais je pensais juste mentionner que v5 * pourrait * avoir un ['switch'] (https://github.com/json-schema/json-schema/wiki/ switch-% 28v5-proposal% 29) mot-clé qui fait exactement ce que vous voulez. Nous devrons attendre le brouillon réel, cependant ... – cloudfeet

Répondre

3

J'ai finalement eu quelques informations à ce sujet - il se trouve que vous pouvez faire une union de plusieurs objets différents qui sont valides comme ceci:

{ 
    "description" : "Food", 
    "type" : [ 
     { 
      "type" : "object", 
      "additionalProperties" : false, 
      "properties" : { 
       "type" : { 
        "type" : "string", 
        "required" : true, 
        "enum": [ 
         "hot_dog" 
        ] 
       }, 
       "bun" : { 
        "type" : "string", 
        "required" : true 
       }, 
       "ketchup" : { 
        "type" : "string", 
        "required" : true 
       } 
      } 
     }, 
     { 
      "type" : "object", 
      "additionalProperties" : false, 
      "properties" : { 
       "type" : { 
        "type" : "string", 
        "required" : true, 
        "enum": [ 
         "ice_cream" 
        ] 
       }, 
       "cone" : { 
        "type" : "string", 
        "required" : true 
       }, 
       "chocolate_sauce" : { 
        "type" : "string", 
        "required" : true 
       } 
      } 
     } 
    ] 
} 

Je ne suis toujours pas sûr si cela est JSON valide, puisque mon Schemavalidator meurt sur une entrée invalide, mais il accepte l'entrée valide comme prévu.

Questions connexes