2013-08-22 10 views
20

Der Rest Dienstantwort ich arbeite mit Beispiel zu folgenden ähnlich ist, ich habe hier nur drei Felder enthalten, aber es gibt viel mehr:Wie Definitionen in JSON Schema verwenden (draft-04)

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

I will eine JSON-Schemadatei schreiben, für oben (draft-04), die das explizit angeben werden:

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] 

aber sind nicht in der Lage, alle Unterlagen oder ein Beispiel dafür, wie es zu tun zu finden.

Derzeit meine JSON Schema sieht wie folgt aus:

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

Alle Zeiger/Beispiele, wie ich damit umgehen sollte.

+0

Ich glaube, Sie dies mit einer Erbschaft beschreiben sollten: Typ Person erweitert MyObject, Typ Company erweitert MyObject und definiert in Ihrem Hauptschema ein Array mit Elementen vom Typ MyObject –

+0

Ich weiß nicht, wie ähnlich JSONSchema zu XSD ist, aber von dem, was ich über XSD weiß, brauchen Sie keinen Common Oberklasse für Ihr Objekt. Sie möchten Ihre Vererbung in den Schemafiles. ZB ein abstrakter Platzhalter in Ihrem Hauptschema, der es dem Personenschema und dem Firmenschema erlaubt, seinen Platz einzunehmen. – atomman

+0

Ich sehe Abhängigkeiten auch in draf 3. Kann jemand irgendwelche Unterschiede bezüglich Abhängigkeiten zwischen Draft 3 und 4 erklären? – Relequestual

Antwort

30

Ich denke, der empfohlene Ansatz ist der in Json-Schema web, Example2 gezeigte Ansatz. Sie müssen eine Aufzählung verwenden, um Schemas "nach Wert" auszuwählen. In Ihrem Fall wäre es so etwas wie:

{ 
    "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

Was würden Sie anstelle von oneOf verwenden, wenn Sie nur wissen, dass der Inhalt der result-Array-Eigenschaft einige unbekannte Untertypen sind, sagt "Party"? verwandte Frage hier gepostet http://stackoverflow.com/questions/19416873/how-to-tell-json-schema-validator-to-pick-schema-from-property-value :) – redben

9

Sorry,

ich nicht den Punkt. Die Frage bezieht sich auf das Schlüsselwort 'Abhängigkeiten', das Teil der letzten JSON-Schema-Spezifikation ist, oder?

finde ich nicht ‚Abhängigkeiten‘ in der akzeptierte Antwort (?)

Es ist kurz im letzten Entwurf erläutert. Aber http://usingjsonschema.com erklärten sowohl Eigentum und Definition Abhängigkeiten in dem Buch:

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

Start auf Seite 29 (siehe, erklärte auf Seite 30)

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

Hallo Sebastian, mit ** Abhängigkeiten * * ist es möglich, den obigen Anwendungsfall zu erreichen. [Frage-klick bitte] (http://stackoverflow.com/questions/36830827/conditional-json-schema-validation-based-on-property-value). Ist es möglich, das Feld basierend auf dem Wert einer anderen Eigenschaft erforderlich zu machen? Es wäre großartig, wenn Sie die Frage in dem Link beantworten könnten. Danke, Harry. – Harry

+0

@Harry Muss ich wirklich? Die Antwort einige Minuten nachdem du von "Jason" gefragt hast, ist perfekt! (siehe Ihre Frage) – sebilasse

+1

@SebastianLasse, vielleicht ist der Titel verwirrend, aber bitte lesen Sie den ursprünglichen Fragetext nach 'der dies explizit spezifizieren wird 'und Sie werden feststellen, dass die Antwort die Frageerfordernisse löst. Die Frage bezieht sich nicht auf die Verwendung von Json-Schema 'Abhängigkeiten' Schlüsselwort wirklich. Fühlen Sie sich frei, den Titel zu verbessern. – jruizaranguren