数组的类型特定参数,可以用来限制成员类型、是否允许额外成员、最小元素个数、最大元素个数、是否允许元素重复。
4.1.1 数组成员类型关键字: items
可以要求数组内每个成员都是某种类型,通过关键字items实现。下面的Schema要求数组内所有元素都是数值,这时关键字"items"对应一个嵌套的Json Schema,这个Json Schema定义了每个元素应该满足的规范。
{ "type": "array", "items": { "type": "number" } }[1, 2, 3]
关键字items还可以对应一个数组,这时Json数组内的元素必须与Json Schema内items数组内的每个Schema按位置一一匹配。
{ "type": "array", "items": [ { "type": "number" }, { "type": "string" }] }[1, "abc"]
4.1.2 数组是否允许额外成员关键字: additionalItems
当使用了items关键字,并且items关键字对应的是Schema数组,这个限制才起作用。关键字additionalItems规定Json数组内的元素,除了一一匹配items数组内的Schema外,是否还允许多余的元组。当additionalItems为true时,允许额外元素。
{ "type": "array", "items": [ { "type": "number" }, { "type": "string" }], "additionalItems" : true }[1, "abc", "x"]
4.1.3 数组元素个数关键字: minItems, maxItems
可以限制数组内元素的个数。
{ "type": "array", "items": { "type": "number" }, "minItems" : 5, "maxItems" : 10 }[1,2,3,4,5,6]
4.1.4 数组内元素是否必须唯一关键字: uniqueItems
规定数组内的元素是否必须唯一。
{ "type": "array", "items": { "type": "number" }, "uniqueItems" : true }[1,2,3,4,5]
4.2 对象Json对象是最常见的Json数据类型,合法的数据可以是
{ "name": "Froid", "age" : 26, "address" : { "city" : "New York", "country" : "USA" } }就对象类型而言,最基本的类型限制Schema是
{"type" : "object"}
然而,除了类型外,我们通常需要对其成员做进一步约定。对象的类型特定关键字,大多是为此目的服务的。
4.2.1 成员的Schema关键字:properties
规定对象各成原所应遵循的Schema。
{ "type": "object", "properties": { "name": {"type" : "string"}, "age" : {"type" : "integer"}, "address" : { "type" : "object", "properties" : { "city" : {"type" : "string"}, "country" : {"type" : "string"} } } } }对于上例中的Schema,合法的data是
{ "name": "Froid", "age" : 26, "address" : { "city" : "New York", "country" : "USA" } }properties关键字的内容是一个key/value结构的字典,其key对应Json数据中的key,其value是一个嵌套的Json Schema。表示Json数据中key对应的值所应遵守的Json Schema。在上面的例子中,"name"对应的Schema是{"type" : "string"},表示"name"的值必须是一个字符串。在Json数据中,对象可以嵌套,同样在Json Schema中也可以嵌套。如"address"字段,在Json Schema中它的内容是一个嵌套的object类型的Json Schema。
4.2.2 批量定义成员Schema关键字:patternProperties
与properties一样,但是key通过正则表达式匹配属性名。
{ "type": "object", "patternProperties": { "^S_": { "type": "string" }, "^I_": { "type": "integer" } } }{"S_1" : "abc"}
{"S_1" : "abc", "I_3" : 1}
关键字:required
规定哪些对象成员是必须的。
{ "type": "object", "properties": { "name": {"type" : "string"}, "age" : {"type" : "integer"}, }, "required" : ["name"] }上例中"name"成员是必须的,因此合法的数据可以是
{"name" : "mary", "age" : 26}
{"name" : "mary"}
但缺少"name"则是非法的
{"age" : 26}
4.2.4 成员依赖关系关键字:dependencies
规定某些成员的依赖成员,不能在依赖成员缺席的情况下单独出现,属于数据完整性方面的约束。
{ "type": "object", "dependencies": { "credit_card": ["billing_address"] } }dependencies也是一个字典结构,key是Json数据的属性名,value是一个数组,数组内也是Json数据的属性名,表示key必须依赖的其他属性。
上面Json Schema合法的数据可以是
{}
{"billing_address" : "abc"}
但如果有"credit_card"属性,则"billing_address" 属性不能缺席。下面的数据是非法的
{"credit_card": "7389301761239089"}
4.2.5 是否允许额外属性关键字:additionaProperties