规定object类型是否允许出现不在properties中规定的属性,只能取true/false。
{ "type": "object", "properties": { "name": {"type" : "string"}, "age" : {"type" : "integer"}, }, "required" : ["name"], "additionalProperties" : false }上例中规定对象不能有"name"和"age"之外的成员。合法的数据
{"name" : "mary"}
{"name" : "mary", "age" : 26}
非法的数据
{"name" : "mary", "phone" : ""84893948}
4.2.6 属性个数的限制关键字:minProperties, maxProperties
规定最少、最多有几个属性成员。
{ "type": "object", "minProperties": 2, "maxProperties": 3 }{"name" : "mary", "age" : 26}
{"name" : "mary", "age" : 26, "phone" : "37839233"}
关键字:allOf, anyOf, oneOf, not
从关键字名字可以看出其含义,满足所有、满足任意、满足一个。前三个关键字的使用形式是一致的,以allOf为例说明其形式。
{ "allOf" : [ Schema1, Schema2, ... ] }其中,"allOf"的内容是一个数组,数组内的成员都是内嵌的Json Schema。上例Schema1、Schema2都是内嵌的Json Schema。整个Schema表示当前Json数据,需要同时满足Schema1、Schema2,。
5.1 allOf满足allOf数组中的所有Json Schema。
{ "allOf" : [ Schema1, Schema2, ... ] }需要注意,不论在内嵌的Schema里还是外部的Schema里,都不应该使"additionalProperties"为false。否则可能会生成任何数据都无法满足的矛盾Schema。
可以用来实现类似“继承”的关系,例如我们定义了一个Schema_base,如果想要对其进行进一步修饰,可以这样来实现。
{ "allOf" : [ Schema_base ] "properties" : { "other_pro1" : {"type" : "string"}, "other_pro2" : {"type" : "string"} }, "required" : ["other_pro1", "other_pro2"] }Json数据既需要满足Schema_base,又要具备属性"other_pro1"、"other_pro2"。
5.2 anyOf满足anyOf数组中的任意个Schema。
{ "anyOf" : [ Schema1, Schema2, ... ] }Json数据需要满足Schema1、Schema2中的一个或多个。
5.3 oneOf满足且进满足oneOf数组中的一个Schema,这也是与anyOf的区别。
{ "oneOf" : [ Schema1, Schema2, ... ] } 5.4 not这个关键字不严格规定Json数据应满足什么要求,它告诉Json不能满足not所对应的Schema。
{ "not" : {"type" : "string"} }只要不是string类型的都Json数据都可以。
6. 复杂结构对复杂结构的支持包括定义和引用。可以将相同的结构定义成一个“类型”,需要使用该“类型”时,可以通过其路径或id来引用。
6.1 定义关键字:无
定义一个类型,并不需要特殊的关键字。通常的习惯是在root节点的definations下面,定义需要多次引用的schema。definations是一个json对象,key是想要定义的“类型”的名称,value是一个json schema。
{ "definitions": { "address": { "type": "object", "properties": { "street_address": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" } }, "required": ["street_address", "city", "state"] } }, "type": "object", "properties": { "billing_address": { "$ref": "#/definitions/address" }, "shipping_address": { "$ref": "#/definitions/address" } } }上例中定义了一个address的schema,并且在两个地方引用了它,#/definitions/address表示从根节点开始的路径。
6.2 \(id > **关键字:\)id**可以在上面的定义中加入\(id属性,这样可以通过\)id属性的值对该schema进行引用,而不需要完整的路径。
... "address": { "type": "object", "$id" : "address", "properties": { "street_address": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" } }, "required": ["street_address", "city", "state"] } ... 6.3 引用关键字:$ref
关键字$ref可以用在任何需要使用json schema的地方。如上例中,billing_address的value应该是一个json schema,通过一个$ref替代了。
$ref的value,是该schema的定义在json中的路径,以#开头代表根节点。
{ "properties": { "billing_address": { "$ref": "#/definitions/address" }, "shipping_address": { "$ref": "#/definitions/address" } } }如果schema定义了\(id属性,也可以通过该属性的值进行引用。 ``` { "properties": { "billing_address": { "\)ref": "#address" },
"shipping_address": { "$ref": "#address" }
}
}