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?
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.
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