2015-08-05 9 views
23

Vorrei sapere se posso definire uno schema JSON (bozza 4) che richiede almeno una delle molte proprietà possibili per un oggetto. So già di allOf, anyOf e oneOf ma non riesco a capire come usarli nel modo che voglio.Come definire uno schema JSON che richiede almeno una delle molte proprietà

Ecco alcuni esempio JSON per illustrare:

// 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" 
} 

desidero richiedere almeno id o email (accettando anche entrambi) ed ancora superato la convalida secondo il formato. Utilizzando oneOf non riesce la convalida se fornisco sia la validazione (prova 3), anyOf passa anche se uno di loro non è valido (prova 4)

Ecco il mio schema:

{ 
    "$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" 
       } 
      } 
     } 
    ] 
} 

mi potete aiutare come ottenere la convalida corretta per il mio caso d'uso?

risposta

40

Per richiedere almeno uno di un insieme di proprietà, utilizzare required all'interno di una serie di anyOf opzioni:

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

Se una delle proprietà che si desidera è presente ("id", "email"), poi passerà l'opzione corrispondente in allOf.

Problemi correlati