JSON开发笔记(三)——JSONSchema实战(中)
1. JSON Schema关键字简介
上篇⽂章中,我们通过⼀个简单的JSON Schema的例⼦,简要地介绍了JSON Schema中经常⽤到的关键字,并介绍了⼀些在线辅助⼯具。⼀般来说,掌握了这些知识点就可以应对⽐较常见的需求场景了,但是,如果你需要更多的定制化要求以及更加深⼊的细节校验的话,那么,我们就需要进⼀步了解更多关键字的⽤法和使⽤场景。
2. JSON Schema关键字详解
例⼀:涉及的关键字($schema、title、description、type、properties、required)
{
"$schema": "/draft-04/schema#",
"title": "TestInfo",
"description": "some information about test",
"type": "object",
"properties": {
"name": {
"description": "Name of the test",
"type": "string"
}
},
"required": [
"name"
]
}
2.1 $schema
该关键字⽤于指定JSON Schema版本信息,例⼀中指定的版本为:draft-04。该关键字是可以省略的,当前最新版本为draft-06。注意:该关键字的值必须使⽤官⽅提供的值,不能⾃⼰随便写。
2.2 title和description
这两个关键字都是⽤来描述对应的JSON元素的,唯⼀的区别在于,title相对来说,更加简洁,⽽description更加倾向于详细描述相关信息。当然了,这两个关键字都是可以省略的。我们看到例⼀中最外层的title和description是对待校验JSON对象的描述,⽽其中,name元素之下的description其实是对待校验JSON对象的⼀级key(name)的描述,当然,你也可以对name增加title信息。
2.3 type
该关键字⽤于限定待校验JSON元素所属的数据类型,例⼀中最外层的type关键字值为object,即表⽰待校验JSON数据为⼀个JSON对象,⽽name下的type关键字值为string,即表⽰待校验JSON对象中的⼀级key(name)的数据类型为string。那么,按照这个要求,下⾯这个JSON数据是符合要求的。
{
"name": "hello first blog"
}
⽽,下⾯这个JSON数据是不符合要求的,因为name的类型为integer或者number,⽽不是string。
{
"name": 520
}
2.3.1 type常见取值
那么,type⼜有哪些取值呢?当type取值为string类型的时候,是否还可以添加其他⼀些附加限制条件呢?我们接下来会按照type的不同取值⼀点点分析涉及到的关键字含义及⽤法。⾸先,我们来看⼀下,type常见的取值。具体如下:
type取值对应的Java数据类型
object java.lang.Object
array java.util.List
integer int(java.lang.Integer)
number float(java.lang.Float)或int
null null
boolean java.lang.Boolean
string java.lang.String
在上表中,我们采⽤了和Java数据类型对⽐分析的形式给出了type的常见取值,接下来,我们会分析当type为不同取值时,可能涉及的关键字含义和⽤法。
2.3.2 从type的不同取值说起
(1)当type取值为object时,涉及的关键字:properties、required、minProperties、maxProperties、propertyNames、dependencies、patternProperties、additionalProperties
properties
该关键字的值是⼀个对象。
⽤于指定JSON对象中的各种不同key应该满⾜的校验逻辑,如果待校验JSON对象中所有值都能够通过该关键字值中定义的对应key 的校验逻辑,每个key对应的值,都是⼀个JSON Schema,则待校验JSON对象通过校验。从这⾥,我们可以看到,只要待校验JSON对象的所有key分别都通过对应的JSON Schema的校验检测,这个对象才算是通过校验。
另外,需要注意的是,省略该关键字和该关键字的值为空对象,具有相同效果。例如:
"properties": {
"id": {
"description": "The unique identifier for a book",
"type": "integer",
"minimum": 1
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
}
required
该关键字的值是⼀个数组,⽽数组中的元素必须是字符串,⽽且必须是唯⼀的。
该关键字限制了JSON对象中必须包含哪些⼀级key。如果⼀个JSON对象中含有required关键字所指定的所有⼀级key,则该JSON对象能够通过校验。
另外,需要注意的是,省略该关键字和该关键字的值为空数组,具有相同效果。例如:
"required": [
"id",
"name",
"price"
]
minProperties、maxProperties
这两个关键字的值都是⾮负整数。
指定了待校验JSON对象中⼀级key的个数限制,minProperties指定了待校验JSON对象可以接受的最少⼀级key的个数,⽽maxProperties指定了待校验JSON对象可以接受的最多⼀级key的个数。
另外,需要注意的是,省略minProperties关键字和该关键字的值为0,具有相同效果。⽽,如果省略maxProperties关键字则表⽰对⼀级key的最⼤个数没有限制。例如,如果限制⼀个JSON对象的⼀级key的最⼤个数为5,最⼩个数为1,则JSON Schema如下:
"minProperties": 1,
"maxProperties": 5
propertyNames
注意:该关键字,官⽅说明中⽀持,但是,有可能你使⽤的平台或者第三⽅⼯具不⽀持哦。所以,使⽤需谨慎。
该关键字的值是⼀个有效的JSON Schema。
如果待校验JSON对象中的每个⼀级key都能通过该关键字指定的JSON Schema的校验,那么才认为待校验的JSON对象通过校验。注意,待校验JSON对象的⼀级key都是string类型。
json值的类型有哪些
另外,需要注意的是,省略该关键字和该关键字的值为空JSON Schema,具有相同效果。
patternProperties
该关键字的值是⼀个JSON对象,该JSON对象的每⼀个⼀级key都是⼀个正则表达式,value都是⼀个JSON Schema。
只有待校验JSON对象中的⼀级key,通过与之匹配的patternProperties中的⼀级正则表达式,对应的JSON Schema的校验,才算通过校验。例如,如果patternProperties对应的值如下:
"patternProperties": {
"^a": {
"type": "number"
},
"^b": {
"type": "string"
}
}
上⾯的JSON Schema表⽰,待校验JSON对象中,所有以a开头的⼀级key的value都必须是number,所有以b开头的⼀级key的value都必须是string。
additionalProperties
该关键字的值是⼀个JSON Schema。
如果待校验JSON对象中存在,既没有在properties中被定义,⼜没有在patternProperties中被定义,那么这些⼀级key必须通过additionalProperties的校验。
dependencies
待定。。。
完整⽰例:
{
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a book",
"type": "integer",
"minimum": 1
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
},
"patternProperties": {
"^a": {
"type": "number"
},
"^b": {
"type": "string"
}
},
"additionalProperties": {
"type": "number"
},
"minProperties": 1,
"maxProperties": 5,
"required": [
"id",
"name",
"price"
]
}
(2)当type取值为array时,涉及的关键字:items、additionalItems、minItems、maxItems、uniqueItems、contains items
该关键字的值是⼀个有效的JSON Schema或者⼀组有效的JSON Schema。
当该关键字的值是⼀个有效的JSON Schema时,只有待校验JSON数组中的所有元素均通过校验,整个数组才算通过校验。例如,如果items关键字的具体定义如下:
{
"type": "array",
"items": {
"type": "string",
"minLength": 5
}
}
上⾯的JSON Schema的意思是,待校验JSON数组的元素都是string类型,且最⼩可接受长度是5。那么下⾯这个JSON数组明显是符合要求的,具体内容如下:
["myhome", "green"]
那么下⾯这个JSON数据则是不符合要求,因为第⼀个元素的长度⼩于5,具体内容如下:
["home", "green"]
当该关键字的值是⼀组有效的JSON Schema时,只有待校验JSON数组的所有元素通过items的值中对应位置上的JSON Schema的校验,那么,整个待校验JSON数组才算通过校验。
这⾥需要注意的是,如果items定义的有效的JSON Schema的数量和待校验JSON数组中元素的数量不
⼀致,那么就要采⽤“取⼩原则”。即,如果items定义了3个JSON Schema,但是待校验JSON数组只有2个元素,这时,只要待校验JSON数组的前两个元素能够分别通过items中的前两个JSON Schema的校验,那么,我们认为待校验JSON数组通过了校验。⽽,如果待校验JSON数组有4个元素,这时,只要待校验JSON数组的前三个元素能够通过items中对应的JSON Schema的校验,我们就认为待校验JSON数组通过了校验。
例如,如果items的值如下:
{
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
},
{
"type": "string"
}
]
}
上⾯的JSON Schema指出了待校验JSON数组应该满⾜的条件,数组的第⼀个元素是string类型,且最⼩可接受长度为5,数组的第⼆个元素是number类型,最⼩可接受的值为10,数组的第三个元素是string类型。那么下⾯这两个JSON数组明显是符合要求的,具体内容如下:
["green", 10, "good"]
["helloworld", 11]
下⾯这两个JSON数组却是不符合要求的,具体内容如下:
["green", 9, "good"]
["good", 12]
additionalItems

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。