在JSON中,数组中每个元素的类型都可能不一样。
// a schema
{ "type": "array" }
// success
[1, 2, 3, 4, 5]
// success
[3, "different", { "types" : "of values" }]
// failure
{"Not": "an array"}
默认情况下,数组元素可以是任何类型。但是,通常,我们需要限制数组元素的类型,这时候,可以使用items
和additionalItems
关键字。
在JSON中,有两种方式来校验数组元素:
任意长度的数组,每一个元素都匹配同一类型。可以使用单个items
关键字进行校验。
另外,这种情况下,additionalItems
关键字没有意义,它也不能被使用。
// a schema
{
"type": "array",
"items": {
"type": "number"
}
}
// success
[1, 2, 3, 4, 5]
// faliure
[1, 2, "3", 4, 5]
// success
[]
当数组中每一项具有不同的意义,而且它们的类型又不相同时,可以使用Tuple validation。
例如街道地址:
1600 Pennsylvania Avenue NW
它们的意思是:
[number, street_name, street_type, direction]
为此,我们需要校验这个数组,则需要按顺序校验每个元素的类型。
// a schema
{
"type": "array",
"items": [{
"type": "number"
}, {
"type": "string"
}, {
"type": "string",
"enum": ["Street", "Avenue", "Boulevard"]
}, {
"type": "string",
"enum": ["NW", "NE", "SW", "SE"]
}]
}
// success
[1600, "Pennsylvania", "Avenue", "NW"]
// failure
[24, "Sussex", "Drive"]
// failure
["Palais de l'Élysée"]
// success
[10, "Downing", "Street"]
// success
[1600, "Pennsylvania", "Avenue", "NW", "Washington"]
additionalItems
关键字用于控制是否允许有额外的元素。
当additionalItems
关键字的值为false时,表示不允许有额外的元素。
// a schema
{
"type": "array",
"items": [{
"type": "number"
}, {
"type": "string"
}, {
"type": "string",
"enum": ["Street", "Avenue", "Boulevard"]
}, {
"type": "string",
"enum": ["NW", "NE", "SW", "SE"]
}],
"additionalItems": false
}
// success
[1600, "Pennsylvania", "Avenue", "NW"]
// success
[1600, "Pennsylvania", "Avenue"]
// failure
[1600, "Pennsylvania", "Avenue", "NW", "Washington"]
可以使用minItems
和maxItems
来限制数组元素的个数。
// a schema
{
"type": "array",
"minItems": 2,
"maxItems": 3
}
// failure
[]
// failure
[1]
// success
[1, 2]
// success
[1, 2, 3]
// failure
[1, 2, 3, 4]
当需要保证数组中每个元素都是唯一时,可以使用关键字uniqueItems
,并将值设为true。
// a schema
{
"type": "array",
"uniqueItems": true
}
// success
[1, 2, 3, 4, 5]
// failure
[1, 2, 3, 3, 4]
// success
[]