http://json-schema.org/understanding-json-schema/about.html

json schema validation是用来校验请求的json格式是否为约定的格式,类似于一种协议检查,可以检查字段的类型,默认值,字段名等等,保证通过校验的json数据就是符合预期可以正常使用,不会导致程序core的一种工具。

先来看一个schema的例子,json schema本身就是一个json描述的东西,所以内容上按照json直接解读就行了

基础认识

在json schema validator中,我们可以使用空对象{}或者true来表示任何符合json格式的数据都可通过校验,用false来表示任何数据校验都不通过

在json schema validator中,type是用于描述某个字段的类型的,type关键字的用法:

http://json-schema.org/understanding-json-schema/reference/type.html#type

甚至还可以直接使用别人的schema,不需要自己再写一次schema:

validator的详细文档

http://json-schema.org/understanding-json-schema/reference/index.html

基本上看最开始的那个例子能够知道是怎么校验的,这里只补充一些平时开发中遇到的特殊信息描述,若还遇到新的,查上面的链接,继续补充文档

type

类似{"type":"string"}表示字段是一个字符串,还有这种写法{"type":["number","string"]},表示这个字段可以是数字,也可以是字符串

string字段校验

可以校验长度

{"type":"string","minLength":2,"maxLength":3},字符串字段,并且长度为2-3个字符才能通过校验

还可以正则匹配,只要字符串能正则匹配上,就会通过校验,不论匹配多少处

校验格式

{"type":"string","format":"date"} 类似这种的都是内置的格式校验(有多种,需要具体去看格式要求):

number字段校验

数值为某个数的倍数

{"type":"number","multipleOf":10}

限制数值范围

{"type":"number","minimum":10,"maximum":20}

exclusiveMaximum和exclusiveMinimum在新版的validator中是一个bool含义的字段,见下图

object对象字段

properties属性,表示这个obj有什么字段,可以对子对象进行嵌套判断,所有的属性规则都是适用于判断的。

{"type":"object","properties":{"key1":{"type":"string"}}}

patternProperties对象的正则字段名

{"type":"object","patternProperties":{"^I_":{"type":"string"}}}

additionalProperties是否有schema定义外的额外字段

是一个bool量,false表示不允许,所有字段都必须出现在schema定义中,没有给出这个属性时,默认是允许有额外字段的。

也可以给这个属性给一个schema的值,例如

{"type":"object","additionalProperties":{"type":"string"}}

表示允许有额外的字段,但是必须是字符串,addtionalProperties可以和上面几个属性一起用

要注意additonalProperties属性所在的层级,它只会限制它所在的object的schema定义

required必填字段

{"type":"object","properties":{"key1":{"type":"number"},"key2":{"type":"string"}

},"required":["key1","key2"]} 表示字段key1 key2都必填,并且不能是null

还可以指定object的字段数量

{"type":"object","minProperties":2,"maxProperties":3}

字段数必须是2-3

array数组字段

简单的数组检查{"type":"array"},这样任何数组json都可以通过校验,例如[1,2,3,4],["hello","world"],[3, "different", { "types" : "of values" }]

数组检查有以下两种,一种是数组,一种是元组tuple(固定长度的数组)

数组检查-items属性

如果想要对数组内的元素有校验要求,可以使用items

{"type":"array","items":{"type":"number"}}

items属性下可以是一个普通的schema值

tuple检查-prefixItems属性

tuple是一个固定长度的数组,往往是一些有固定含义的内容,使用prefixItems可以对这种情况进行校验

下面的表示数组(tuple)中开头的四个元素必须是规定的类型

此时可以搭配items属性,表示是否允许有prefixItems定义的数量外的元素,此时和additionalProperties作用相当

{
  "type": "array",
  "prefixItems": [
    { "type": "number" },
    { "type": "string" },
    { "enum": ["Street", "Avenue", "Boulevard"] },
    { "enum": ["NW", "NE", "SW", "SE"] }
  ],
  "items": false
}

items属性强限制了数组中的元素类型和描述,可以使用contains属性表示只要数组中有符合指定类型的元素就行,不需要每个元素都满足

{
   "type": "array",
   "contains": {
     "type": "number"
   }
}

minContains、maxContains,限制contains的元素的数量

minItems,maxItems限制元素数量,uniqueness限制是否允许重复

composition复合schema

这个是用于构建复杂的schema

allOf表示所有的都必须满足,oneOf表示只能满足一个,anyOf表示需要满足一个或以上的schema,not表示不能是指定的schema

要注意一些字段的特有关键词可以直接用,例如下面的allOf示例,首先要求是字符串,其次要求字符串的长度不能超过5(maxLength是字符串字段的特有属性)

条件判断。。遇到再补充

可以说json validator是无所不能了,校验的方式很全面,很丰富,能力很强

https://json-schema.org/understanding-json-schema/reference/conditionals.html