2013-03-13 4 views
12

Ich habe ein ungeordnetes Array von JSON-Elementen. Gemäß der Spezifikation http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.5 wird das unten angegebene JSON-Schema nur dann validieren, wenn die Objekte in dem Array in dieser Reihenfolge erscheinen. Ich möchte keine Reihenfolge angeben, sondern nur die Objekte innerhalb des Arrays validieren, unabhängig von der Reihenfolge oder Anzahl der Objekte. Aus der Spezifikation kann ich nicht verstehen, wie das gemacht wird.Korrigiere JSON-Schema für ein Array von Elementen unterschiedlichen Typs

"transactions" : { 
    "type" : "array", 
    "items" : [ 
     { 
      "type" : "object", 
      "properties" : { 
       "type" : { 
        "type" : "string", 
        "enum" : ["BUILD", "REASSIGN"] 
       } 
      } 
     }, 
     { 
      "type" : "object", 
      "properties" : { 
       "type" : { 
        "type" : "string", 
        "enum" : ["BREAK"] 
       } 
      } 
     } 
    ] 
} 
+0

Nun, diese JSON ist nicht einmal von Anfang an gültig. –

+0

Können Sie mich auf den spezifischen ungültigen Teil verweisen? Dies ist ein Auszug aus einer viel größeren JSON-Schemadatei, die selbst json lint gut übergibt. Vielleicht gibt es einen Tippfehler, den ich nicht sehe? Ich denke nicht, dass das einen Downvote wert ist - Sie könnten nur einen Schnitt vorschlagen. – deepwinter

+0

Gefunden die Ungültigkeiten - Nebenwirkungen von, wenn ich den JSON aus der größeren Datei exzerpierte. – deepwinter

Antwort

27

Ich fragte diese gleiche Frage auf der JSON-Schema Google-Gruppe, und es wurde schnell beantwortet. Benutzer fge darum gebeten, dass ich seine Antwort hier posten:

Hallo,

Die aktuelle Spezifikation ist v4 Entwurf, nicht v3 entwerfen. Mehr Insbesondere ist die Validierung Spezifikation hier:

http://tools.ietf.org/html/draft-fge-json-schema-validation-00

Die Website nicht aktuell ist, weiß ich nicht, warum ... Ich werde einen Pull Antrag stellen.

Mit Entwurf v4 Sie diese verwenden können:

{ 
    "type": "array", 
    "items": { 
     "oneOf": [ 
      {"first": [ "schema", "here" ] }, 
      {"other": [ "schema": "here" ] } 
     ] 
    } 
} 

Zum Beispiel ist dies ein Schema für ein Array, in dem Elemente entweder Strings oder ganze Zahlen sein können (es kann in einem mehr geschrieben werden obwohl einfache Fahrt):

{ 
    "type": "array", 
    "items": { 
     "oneOf": [ 
      {"type": "string"}, 
      {"type": "integer"} 
     ] 
    } 
} 

Dies ist die richtige Antwort. Mein korrigiertes Schema enthält jetzt:

"transactions" : { 
    "type" : "array", 
    "items" : { 
     "oneOf" : [ 
      { 
       "type" : "object", 
       "properties" : { 
        "type" : { 
         "type" : "string", 
         "enum" : ["BUILD", "REASSIGN"] 
        } 
       } 
      }, 
      { 
       "type" : "object", 
       "properties" : { 
       "type" : { 
        "type" : "string", 
        "enum" : ["BREAK"] 
        } 
       } 
      } 
     ] 
    } 
} 
2

Ich habe das schon eine ganze Weile untersucht. Aber ich habe keine funktionierende Lösung gefunden. Es funktioniert gut, wenn Sie nur ein Schema haben, z.

"transactions" : { 
      "type" : "array", 
      "items" : 
      { 
      "type" : "object", 
      "properties" : { 
       "type" : { 
       "type" : "string", 
       "enum" : ["BREAK"] 
       }, 
      } 
} 

Dann überspringen Sie einfach die Array-Klammern und verwenden ein Objekt. Wenn Sie jedoch tun wollen, was Sie tun, scheint es keine solide Antwort zu geben. Dies ist das einzige, was ich bisher gefunden habe: http://the-long-dark-tech-time.blogspot.se/2012/12/using-json-schema-with-array-of-mixed.html

2

Für alle mit dem Entwurf 3 Schema fest. Es ist ein „Typ“ Schlüsselwort, das auf die „Bestimmungen haften“ im Entwurf entspricht 4:

So können Sie

{ 
    "fooBar" : { 
     "type" : "array", 
     "items" : { 
      "type" : [{ 
        "type" : "object", 
        "properties" : { 
         "foo" : {       
          "type" : "string" 
         } 
        } 
       }, { 
        "type" : "object", 
        "properties" : { 
         "bar" : { 
          "type" : "string" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 
0

Als Reaktion auf Benutzer Vdex verwenden: dies ist nicht gleichwertig, was Sie geschrieben bedeutet, dass Array-Elemente in dieser bestimmten Reihenfolge innerhalb des Arrays auftreten.

Vorbehaltlich einer korrekten Implementierung, wenn Sie this schema validator verwenden.

Mit diesem Schema:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "array", 
    "items": [ 
    { 
     "type": "boolean" 
    }, 
    { 
     "type": "number" 
    }, 
    { 
     "type": "string" 
    } 
    ] 
} 

Diese JSON wird validiert werden:

[ 
    true, 
    5, 
    "a", 
    "6", 
    "a", 
    5.2 
] 

Aber nicht dieses:

[ 
    5, 
    true, 
    "a", 
    "6", 
    "a", 
    5.2 
] 

Somit ist das Ziel völlig verschieden von Keywords wie "einer von".

Verwandte Themen