2017-02-02 3 views
0

Ich bin nicht sicher, ob dies mit JSON Schema möglich ist, aber ich habe Daten wie folgt aus:Validieren verschachtelte Liste von Zahlen/booleans mit JSON Schema

[1, 1, [0, 0, [true]], true] 

Wie kann ich bestätigen [0, 0, 1] so dass mindestens eines der Elemente 1/wahr ist?

Bisher habe ich es geschafft Schema zu diesem Punkt zu erstellen:

{ 
 
    "type": "array", 
 
    "items": { 
 
    "$ref": "#/definitions/_items" 
 
    }, 
 
    "definitions": { 
 
    "_items": { 
 
     "anyOf": [ 
 
     { 
 
      "enum": [ 
 
      0, 
 
      1 
 
      ], 
 
      "type": "integer" 
 
     }, 
 
     { 
 
      "enum": [ 
 
      false, 
 
      true 
 
      ], 
 
      "type": "boolean" 
 
     }, 
 
     { 
 
      "type": "array", 
 
      "items": { 
 
      "anyOf": [ 
 
       { 
 
       "$ref": "#/definitions/_items" 
 
       } 
 
      ] 
 
      } 
 
     } 
 
     ] 
 
    } 
 
    } 
 
}

Anscheinend es alle akzeptierten Werte nicht bestätigen, aber es auf nicht Rechnung trägt, wenn es alle, einige, eins oder keine der Werte 1/wahr. Ich habe missverstanden, dass anyOf, allOf und oneOf dafür reserviert sind ...

Antwort

2

Was Sie brauchen, ist ein contains Schlüsselwort. Dies soll in der nächsten Version der JSON-Schema-Spezifikation hinzugefügt werden. Bis das implementiert ist, können Sie es ohne contains tun, aber die Logik ist ein bisschen kompliziert. Ich habe auch einige der unnötigen Teile von dem, was Sie bisher haben, aufgeräumt.

{ 
    "type": "array", 
    "items": { "$ref": "#/definitions/_items" }, 
    "allOf": [{ "$ref": "#/definitions/contains-1-or-true" }], 
    "definitions": { 
    "_items": { 
     "anyOf": [ 
     { "enum": [0, 1] }, 
     { "type": "boolean" }, 
     { "$ref": "#" } 
     ] 
    }, 
    "contains-1-or-true": { 
     "not": { 
     "type": "array", 
     "items": { 
      "not": { "enum": [1, true] } 
     } 
     } 
    } 
    } 
} 
+0

Ich endete zu sehr ähnliche Lösung mit Not Not Notation. Können Sie bitte erklären, warum anyf ref # hier benötigt wird? Funktioniert das wirklich rekursiv für tief verschachtelte Struktur? – MarkokraM

+0

Ja, das funktioniert mit jeder Verschachtelungsebene. Das '{" $ ref ":" # "}' bezieht sich auf das gesamte Schema. Es ist eine rekursive Referenz. Alternativ könnten Sie das tun, indem Sie die ersten drei Zeilen kopieren (ähnlich wie bei Ihnen). Aber die rekursive Referenz ist eine sauberere Lösung, da sie die Duplizierung eliminiert. – Jason

+0

Ich öffnete andere Frage sehr viel damit zu tun, Sie @ Jason könnte eine Antwort geben: http://stackoverflow.com/questions/42026162/xor-logic-in-json-schema-for-list-of- Boolesche Elemente – MarkokraM