4

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

その結果、次のようになります。

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.
4

1 に答える 1

4

enumキーワードには少なくとも 1 つの値が必要です。仕様書には...

5.5.1.1. 有効な値

このキーワードの値は配列でなければなりません。この配列には、少なくとも 1 つの要素が必要です。配列の要素は一意でなければなりません。

配列内の要素は、null を含む任意の型にすることができます。

enum空の場合は何も検証されないことを意味するため、これは理にかなっています。ただし、特定のケースでどのように役立つかはわかります。スキーマを動的に構築する必要がある場合は、空の配列のケースを確認し、別のスキーマを使用する必要があります。

これを行う1つの方法は次のとおりです。

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

ここに別のものがあります:

{
  "type": "array",
  "not": {}
}
于 2016-06-06T04:03:16.663 に答える