Как проверить пустой массив строк с помощью ajv?

Я провожу проверку json с помощью ajv. Мне нужно проверить массив строк. Я знаю, какие элементы можно туда разместить, поэтому делаю соответствующее enum. Но в некоторых случаях enum может быть пустым, и массив тоже может быть пустым. Вот простой тест:

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);

В результате получаю:

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

Я могу добавить любую фиктивную строку в массив перечислений, но можно ли проверить этот случай законным способом? Добавление ограничения minItems = 0 не помогает.

Это действительно ограничение проекта схемы json, что я не могу использовать пустое перечисление?

UPD: я ожидаю проверки кода в общем случае:

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

Я ожидаю проверить код в особом случае:

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.

person NtsDK    schedule 04.06.2016    source источник
comment
Я не понимаю, чего вы пытаетесь достичь. Можете ли вы добавить к своему вопросу несколько примеров JSON, которые вы ожидаете проверить, и несколько примеров, которые, как вы ожидаете, не пройдут проверку. Я уверен, что смогу помочь, если смогу лучше разобраться в проблеме.   -  person Jason Desrosiers    schedule 05.06.2016
comment
Добавил UPD с моими ожиданиями.   -  person NtsDK    schedule 06.06.2016


Ответы (1)


Ключевое слово enum должно иметь хотя бы одно значение. В спецификации указано ...

5.5.1.1. Допустимые значения

Значение этого ключевого слова ДОЛЖНО быть массивом. Этот массив ДОЛЖЕН иметь хотя бы один элемент. Элементы в массиве ДОЛЖНЫ быть уникальными.

Элементы в массиве МОГУТ быть любого типа, включая null.

Это имеет смысл, потому что пустой enum будет означать, что ничто никогда не будет подтверждено. Однако я понимаю, как это может пригодиться в вашем конкретном случае. Если вам нужно создать схему динамически, вам нужно будет проверить регистр пустого массива и использовать другую схему.

Вот один из способов сделать это:

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

Вот еще один:

{
  "type": "array",
  "not": {}
}
person Jason Desrosiers    schedule 06.06.2016