2016-06-04 3 views
1

Ich mache JSON Validierung mit AJV. Ich muss Array von Zeichenfolgen validieren. Ich weiß, welche Elemente dort platziert werden können, also treffe ich "enum". Aber in einigen Fällen kann enum leer sein und das Array kann auch leer sein. Hier ist einfacher Test:Wie validiere leere Array von Strings mit AJV?

var schema = { 
    "type":"array", 
    "items" : { 
     "type" : "string", 
     "enum" : [] 
    } 
} 

var data = []; 

var Ajv = require('./ajv-4.1.1.js'); 
var ajv = Ajv({ 
    allErrors : true 
}); 
var validate = ajv.compile(schema); 
var valid = validate(data); 
if (!valid) 
    console.log(validate.errors); 

Als Ergebnis erhalte ich:

Error: schema is invalid:data.items.enum should NOT have less than 1 items, data.items should be array, data.items should match some schema in anyOf 

Ich kann jede fiktive Zeichenfolge hinzufügen Array ENUM aber ist es möglich, diesen Fall in rechtlicher Weise zu validieren? Die Einschränkung 'minItems = 0' hilft nicht.

Ist es wirklich Json Schema Draft Einschränkung, dass ich leere Enum nicht verwenden kann?

UPD: Ich erwarte, dass Code im allgemeinen Fall überprüfen:

var array = Object.keys(someObj); // array: ["foo", "bar"] 

var schema = { 
    "type":"array", 
    "items" : { 
     "type" : "string", 
     "enum" : array 
    } 
} 

var data = ["foo"]; // valid 
var data = ["bar"]; // valid 
var data = ["bar","foo"]; // valid 

Ich erwarte, dass Code in Sonderfall zu überprüfen:

var array = Object.keys(someObj); // array: [] 

var schema = { 
    "type":"array", 
    "items" : { 
     "type" : "string", 
     "enum" : array 
    } 
} 

var data = []; // I expect to see it valid too but get error instead. 
+0

ich nicht klar bin, was Sie erreichen wollen. Können Sie Ihrer Frage einige Beispiele von JSON hinzufügen, die Sie validieren möchten, und einige Beispiele, bei denen Sie erwarten, dass die Validierung fehlschlägt. Ich bin mir sicher, dass ich helfen kann, wenn ich das Problem besser verstehen kann. – Jason

+0

UPD mit meinen Erwartungen hinzugefügt. – NtsDK

Antwort

3

Das enum Schlüsselwort mindestens einen Wert haben muss. Die Spezifikation besagt ...

5.5.1.1. Gültige Werte

Der Wert dieses Schlüsselworts MUSS ein Array sein. Dieses Array muss mindestens ein Element haben. Elemente im Array MÜSSEN eindeutig sein.

Elemente im Array KÖNNEN von einem beliebigen Typ sein, einschließlich null.

Dies macht Sinn, weil ein leerer enum nichts bestätigen würde bedeuten würde eh und je. Ich sehe jedoch, wie es in Ihrem speziellen Fall nützlich sein könnte. Wenn Sie das Schema dynamisch erstellen müssen, müssen Sie nach dem leeren Array-Case suchen und ein anderes Schema verwenden.

Hier ist eine Möglichkeit, es zu tun:

{ 
    "type": "array", 
    "maxItems": 0 
} 

Hier ist eine andere:

{ 
    "type": "array", 
    "not": {} 
}