web-dev-qa-db-fra.com

Comment définir un schéma JSON qui requiert au moins une des nombreuses propriétés

J'aimerais savoir si je peux définir un schéma JSON (brouillon 4) qui requiert au moins une des nombreuses propriétés possibles pour un objet. Je connais déjà allOf, anyOf et oneOf mais je n'arrive pas à comprendre comment les utiliser de la manière que je veux.

Voici quelques exemples de JSON à illustrer:

// Test Data 1 - Should pass
{

    "email": "[email protected]",
    "name": "John Doe"
}
// Test Data 2 - Should pass
{
    "id": 1,
    "name": "Jane Doe"
}
// Test Data 3 - Should pass
{
    "id": 1,
    "email": "[email protected]",
    "name": "John Smith"
}
// Test Data 4 - Should fail, invalid email
{
    "id": 1,
    "email": "thisIsNotAnEmail",
    "name": "John Smith"
}

// Test Data 5 - Should fail, missing one of required properties
{
    "name": "John Doe"
}

Je voudrais demander au moins id ou email (en acceptant également les deux) et réussir la validation selon le format. L'utilisation de oneOf échoue à la validation si je fournis les deux (test 3), anyOf réussit la validation même si l'un d'eux n'est pas valide (test 4)

Voici mon schéma:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "id": "https://example.com",
    "properties": {
        "name": {
            "type": "string"
        }
    },
    "anyOf": [
        {
            "properties": {
                "email": {
                    "type": "string",
                    "format": "email"
                }
            }
        },
        {
            "properties": {
                "id": {
                    "type": "integer"
                }
            }
        }
    ]
}

Pouvez-vous m'aider à obtenir une validation correcte pour mon cas d'utilisation?

29
MaxiWheat

Pour exiger au moins une propriété parmi un ensemble de propriétés, utilisez required dans une série d'options anyOf:

{
    "type": "object",
    "anyOf": [
        {"required": ["id"]},
        {"required": ["email"]}
        // any other properties, in a similar way
    ],
    "properties": {
        // Your actual property definitions here
    }
{

Si l’une des propriétés souhaitées est présente ("id", "email"), l’option correspondante dans allOf sera transmise.

51
cloudfeet

Vous pouvez utiliser minProperties: number (et maxProperties: number si nécessaire) . Cela raccourcirait la définition du schéma:

{
     type: "object",
     minProperties: 1,
     properties: [/* your actual properties definitions */],
}

Lien vers la documentation: https://json-schema.org/understanding-json-schema/reference/object.html#size

1
NBR