2015-06-19 5 views
5

Für die folgende json string:Was ist der Unterschied zwischen Eigenschaften und Mustereigenschaften im JSON-Schema?

{ 
    "abc" : 123, 
    "def" : 345 
} 

Das folgende Schema hält es gilt:

{ 
    "$schema": "http://json-schema.org/draft-03/schema#", 
    "title": "My Schema", 
    "description": "Blah", 
    "type": "object", 
    "patternProperties": { 
     ".+": { 
      "type": "number" 
     } 
    } 
} 

jedoch verändert sich die die patternProperties zu Immobilien immer noch gültig hält. Was ist dann der Unterschied zwischen diesen 2 Tags?

Antwort

0

Die Eigenschaften (Schlüssel/Wert-Paare) eines Objekts werden mit dem Schlüsselwort properties definiert. Der Wert von Eigenschaften ist ein Objekt, wobei jeder Schlüssel der Name einer Eigenschaft ist und jeder Wert ein JSON-Schema ist, das zum Überprüfen dieser Eigenschaft verwendet wird.

additionalProperties kann das Objekt so einschränken, dass es entweder keine zusätzlichen Eigenschaften enthält, die nicht explizit aufgelistet sind, oder ein Schema für zusätzliche Eigenschaften des Objekts angeben kann. Manchmal ist das nicht genug, und Sie möchten vielleicht die Namen der zusätzlichen Eigenschaften einschränken, oder Sie möchten vielleicht sagen, dass der Wert bei einem bestimmten Namen einem bestimmten Schema entsprechen sollte. Hier kommt patternProperties ins Spiel: Es handelt sich um ein neues Schlüsselwort, das von regulären Ausdrücken zu Schemas passt. Wenn eine zusätzliche Eigenschaft einem bestimmten regulären Ausdruck entspricht, muss sie auch für das entsprechende Schema validiert werden.

Hinweis: Bei der Definition der regulären Ausdrücke muss beachtet werden, dass der Ausdruck irgendwo im Namen der Eigenschaft übereinstimmen kann. Zum Beispiel passt der reguläre Ausdruck "p" zu jedem Eigenschaftsnamen mit einem p darin, wie "Apfel", nicht nur zu einer Eigenschaft, deren Name einfach "p" ist. Es ist daher normalerweise weniger verwirrend, den regulären Ausdruck in^... $ zu umgeben, zum Beispiel "^ p $".

für weitere Referenz - http://spacetelescope.github.io/understanding-json-schema/reference/object.html

+0

Der erste Absatz widerspricht direkt dem Beispiel i gegeben haben: Wenn ich das patternProperties Schlüsselwort Eigenschaften ändern, ohne den Rest des Schemas zu ändern, Es funktioniert immer noch, dh das Schlüsselwort properties verarbeitet auch den regulären Ausdruck. –

+0

kann aufgrund Ihres Schlüsselwortes properties Ihre Regex als eine Eigenschaft mit Werttyp nur als Zahl behandelt haben und Sie geben eine Zahl an, warum sie Ihren Wert akzeptiert hat. Ich bin mir nicht sicher .. – Kandy

0

Semantic von Eigenschaften:

  • Wenn Sie eine Immobilie mit einem Schlüssel erklären in ihren Eigenschaften enthalten, muss es das Schema in Eigenschaften erklärt erfüllen.

Semantic von patternProperties:

  • Wenn Sie eine Immobilie und den Schlüssel erklären erfüllen die Regex in patternProperties definiert, muss es das Schema in patternProperties erklärt erfüllen.

Nach the docs, Eigenschaften Priorität höher als patternProperties, was bedeutet, dass das Schema gegen patternProperties validiert wird nur, wenn es in den Eigenschaften ein Spiel zuerst nicht gewesen ist.

5

Für das obige Schema sollten alle Eigenschaften die Nummer sein. Diese Daten sind ungültig:

{ a: 'a' } 

Wenn Sie patternProperties mit Eigenschaften nur Eigenschaft ersetzen Zahl sein sollte ‚+.‘. Alle anderen Eigenschaften können alles sein.Dies wäre ungültig:

{ '.+': 'a' } 

Dies wäre gültig:

{ a: 'a' } 
+0

Was meinst du, wenn du sagst, dass alle anderen Eigenschaften etwas sein können? Bedeutet das, dass keine der anderen Eigenschaften validiert wird? Wie schränke ich das ein? –

+0

Bei 'patternProperties' werden alle Eigenschaften validiert, die mit den Mustern in Schlüsseln übereinstimmen. Wenn Sie "Eigenschaften" verwenden, werden nur Eigenschaften validiert, die den Schlüsseln entsprechen. Wenn Sie also Eigenschaften validieren möchten, die dem Muster entsprechen, sollten Sie 'patternProperties' verwenden. Wenn Sie alle Eigenschaften für dasselbe Schema validieren möchten, verwenden Sie besser 'additionalProperties'. Ihr Schema kann '' '{" type ":" object "," additionalProperties ": {" type ":" number "}}' '' - es erfordert, dass alle Eigenschaften Zahlen sind. Die Verwendung von patternProperties für diesen Fall ist ineffizient. – esp

+0

okay, so werden Eigenschaften nur Felder validieren, wenn sie genau den gleichen Schlüssel haben. patternProperties stimmt mit allen Schlüsseln überein, die unter dieses Muster fallen. additionalProperties überprüft alle anderen Eigenschaften in der Datei, die noch nicht von den Eigenschaften oder patternProperties erfasst wurden. Ist mein Verständnis richtig? 2 Fragen hier 1. Warum ist patternProperties in diesem Fall ineffizient? 2. Kann ich nicht angeben, dass meine Datei nur diese Eigenschaft enthält? Wie in, scheitern, wenn die Datei eine andere Eigenschaft enthält, die hier nicht erwähnt wird? –

Verwandte Themen