web-dev-qa-db-fra.com

Schéma JSON - spécifiez que le champ est requis en fonction de la valeur d'un autre champ

Vous vous demandez si cela est possible avec le schéma de schéma 03. J'ai des dépendances qui fonctionnent ailleurs, je pense qu'il est peut-être juste nécessaire de les utiliser de manière créative afin de les utiliser pour spécifier la propriété required d'un champ.

Ma meilleure tentative actuelle (qui ne fonctionne pas) devrait vous donner une idée de ce que je recherche. Je veux une valeur requise par défaut et facultative lorsqu'un autre champ a une valeur particulière.

{
    "description"   : "An address...",
    "type" : "object",
    "properties" : {
        "postcode": {
            "type" : "string",
            // postcode should be required by default
            "required" : true,      
            // postcode shouldn't be required if the country is new zealand 
            "dependencies" : {
                "country" : {
                    "enum" : ["NZ", "NZL", "NEW ZEALAND"]
                },
                "postcode" : {
                    "required" : false      
                }
            }
        },
        "country": {
            "type" : "string",
            "enum" : [
                // various country codes and names...
            ],
            "default" : "AUS"
        }
    }
}
35
pospi

C'est certainement possible avec la version 3 du projet. Puisque vous avez une liste complète des pays autorisés, vous pouvez faire quelque chose comme ceci:

{
    "type": [
        {
            "title": "New Zealand (no postcode)",
            "type": "object",
            "properties": {
                "country": {"enum": ["NZ", "NZL", "NEW ZEALAND"]}
            }
        },
        {
            "title": "Other countries (require postcode)",
            "type": "object",
            "properties": {
                "country": {"enum": [<all the other countries>]},
                "postcode": {"required": true}
            }
        }
    ],
    "properties": {
        "country": {
            "type" : "string",
            "default" : "AUS"
        },
        "postcode": {
            "type" : "string"
        }
    }
}

Vous définissez donc deux sous-types pour votre schéma, un pour les pays qui nécessitent un code postal et un pour les pays qui n'en ont pas besoin.

EDIT - l'équivalent v4 est extrêmement similaire. Renommez simplement le niveau supérieur "type" tableau à "oneOf".

27
cloudfeet

Si quelqu'un cherche une solution pour le brouillon 4, vous pouvez utiliser le mot clé dependencies avec un mot clé enum:

{
    "type": "object",
    "properties": {
        "play": {
            "type": "boolean"
        },
        "play-options": {
            "type": "string"
        }
    },
    "dependencies": {
        "play-options": {
            "properties": {
                "play": {
                     "enum": [true]
                }
            }
        }
    }
}

De cette façonplay-options nécessitera toujours que la valeur de play soit true.

12
ppalacios

Je viens de regarder la version 03 de la spécification et je ne pense pas que ce que vous décrivez soit possible. Ce n'est certainement pas "Simple Dependency" et la description de "Schema Dependency" ne mentionne aucun moyen de considérer la valeur de la propriété.

Il semble que ce dont vous avez besoin soit "Dépendance de schéma conditionnelle".

Il y a une discussion sur ce qui est possible avec les dépendances Simple et Schéma ici: http://groups.google.com/group/json-schema/msg/8145690ebb93963b

Vous pouvez demander à ce groupe s'il existe des plans pour prendre en charge les dépendances conditionnelles.

2
Chris Sears