2013-08-22 16 views
20

La risposta di servizio resto sto lavorando con è simile a seguente esempio, ho incluso solo 3 campi qui, ma ci sono molti di più:Come utilizzare le definizioni dello schema JSON (progetto-04)

{ 
    "results": [ 
     { 
      "type": "Person", 
      "name": "Mr Bean", 
      "dateOfBirth": "14 Dec 1981" 
     }, 
     { 
      "type": "Company", 
      "name": "Pi", 
      "tradingName": "Pi Engineering Limited" 
     } 
    ] 
} 

I voglio scrivere un file di schema JSON per il sopra (progetto-04), che specificherà esplicitamente che:

if type == Person then list of required properties is ["type", "name", "dateOfBirth", etc] 
OR 
if type == "Company" then list of required properties is ["type", "name", "tradingName", etc] 

Tuttavia non riesco a trovare alcuna documentazione o esempio di come farlo.

Attualmente il mio schema JSON si presenta come segue:

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "object", 
    "required": ["results" ], 
    "properties": { 
     "results": { 
      "type": "array", 
      "items": { 
       "type": "object", 
       "required": ["type", "name"], 
       "properties": { 
        "type": { "type": "string" }, 
        "name": { "type": "string" }, 
        "dateOfBirth": { "type": "string" }, 
        "tradingName": { "type": "string" } 
       } 
      } 
     } 
    } 
} 

Qualsiasi puntatori/esempi di come devo gestire questo.

+0

penso che si dovrebbe descrivere questo con un'eredità: Digitare Persona estende MyObject, digitare Company estende MyObject e nello schema principale definire un array con elementi di tipo MyObject –

+0

Non so come JSONSchema sia simile a XSD, ma da quello che posso ricordare su XSD non è necessario un comune superclasse per il tuo oggetto. Preferiresti la tua eredità all'interno dei file dello schema. E. un segnaposto astratto nello schema principale, che consentirebbe allo schema della persona e allo schema aziendale di prendere il suo posto. – atomman

+0

Vedo che le dipendenze si trovano anche nella finestra di dialogo. 3. Qualcuno spiega eventuali differenze in relazione alle dipendenze tra le bozze 3 e 4? – Relequestual

risposta

30

Penso che l'approccio consigliato sia quello mostrato in Json-Schema web, Example2. È necessario utilizzare un enum per selezionare gli schemi "in base al valore". Nel tuo caso sarebbe qualcosa di simile:

{ 
    "type": "object", 
    "required": [ "results" ], 
    "properties": { 
     "results": { 
      "type": "array", 
      "items": { 
       "oneOf": [ 
        { "$ref": "#/definitions/person" }, 
        { "$ref": "#/definitions/company" } 
       ] 
      } 
     } 
    }, 
    "definitions": { 
     "person": { 
      "properties": { 
       "type": { "enum": [ "person" ] }, 
       "name": {"type": "string" }, 
       "dateOfBirth": {"type":"string"} 
      }, 
      "required": [ "type", "name", "dateOfBirth" ], 
      "additionalProperties": false 
     }, 
     "company": { 
      "properties": { 
       "type": { "enum": [ "company" ] }, 
       . . . 
      }   
     } 
    } 
} 
+1

Che cosa useresti al posto di oneOf se sai solo che il contenuto della proprietà dell'array dei risultati è di alcuni sottotipi sconosciuti, dice "Party"? domanda correlata pubblicata qui http://stackoverflow.com/questions/19416873/how-to-tell-json-schema-validator-to-pick-schema-from-property-value :) – redben

9

Siamo spiacenti,

Non capisco il punto. La domanda riguarda la parola chiave 'dipendenze' che fa parte dell'ultima specifica dello schema JSON, giusto?

non trovo 'dipendenze' nella risposta accettata (?)

Si è brevemente spiegato nell'ultima bozza. Ma http://usingjsonschema.com spiegato dipendenze sia di proprietà e di definizione nel libro:

http://usingjsonschema.com/assets/UsingJsonSchema_20140814.pdf

inizio a pagina 29 (si veda, ha spiegato a pag 30)

"dependencies": { 
    "shipTo":["shipAddress"], 
    "loyaltyId":["loyaltyBonus"] 
} 
+0

Ciao Sebastian, Utilizzo di ** dipendenze * * è possibile ottenere il caso di utilizzo sopra. [Domanda-clic per favore] (http://stackoverflow.com/questions/36830827/conditional-json-schema-validation-based-on-property-value). È possibile rendere il campo richiesto in base al valore di un'altra proprietà. Sarebbe bello se tu potessi rispondere alla domanda nel link. Grazie, Harry. – Harry

+0

@Harry Ho davvero bisogno di? La risposta alcuni minuti dopo che hai chiesto "Jason" è perfetta! (vedi la tua domanda) – sebilasse

+1

@SebastianLasse, forse il titolo è confuso, ma per favore leggi il testo della domanda originale dopo 'che lo specificherà esplicitamente' e troverai che la risposta risolve i requisiti della domanda. La domanda non è in alcun modo correlata all'uso della parola chiave 'dependencies 'di json-schema. Sentiti libero di migliorare il titolo. – jruizaranguren

Problemi correlati