Json Schema简介 (3)

规定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"}

5. 逻辑组合

关键字: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" }
}
}

# 7. 通用关键字 通用关键字可以在任何json schema中出现,有些影响合法性校验,有些只是描述作用,不影响合法性校验。 ## 7.1 enum > **关键字:enum** 可以在任何json schema中出现,其value是一个list,表示json数据的取值只能是list中的某个。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfsxf.html