如何使用 ajv 验证空字符串数组?

Nts*_*sDK 7 arrays validation json jsonschema ajv

我用 ajv 进行 json 验证。我需要验证字符串数组。我知道哪些元素可以放置在那里,所以我做了适当的“枚举”。但在某些情况下,枚举可以为空,数组也可以为空。这是简单的测试:

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);
Run Code Online (Sandbox Code Playgroud)

结果我得到:

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
Run Code Online (Sandbox Code Playgroud)

我可以将任何虚构的字符串添加到枚举数组中,但是是否可以以合法的方式验证这种情况?添加“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
Run Code Online (Sandbox Code Playgroud)

我希望在特殊情况下验证代码:

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.
Run Code Online (Sandbox Code Playgroud)

Jas*_*ers 6

关键字enum必须至少有一个值。该规范规定...

5.5.1.1. 有效值

该关键字的值必须是一个数组。该数组必须至少有一个元素。数组中的元素必须是唯一的。

数组中的元素可以是任何类型,包括 null。

这是有道理的,因为空enum意味着什么都不会验证。但是,我确实看到它在您的特定情况下如何派上用场。如果需要动态构建架构,则需要检查空数组情况并使用不同的架构。

这是一种方法:

{
  "type": "array",
  "maxItems": 0
}
Run Code Online (Sandbox Code Playgroud)

这是另一个:

{
  "type": "array",
  "not": {}
}
Run Code Online (Sandbox Code Playgroud)