Jsonschema以及在python中的jsonschema
作者:
1. JSON Schema简介
要想完全理解的JSON Schema,我们⾸先需要了解JSON Schema中关键字的含义和作⽤。JSON Schema中⽐较常见的关键字如下:
关键字描述
$schema表⽰该JSON Schema⽂件遵循的规范
title为该JSON Schema⽂件提供⼀个标题
description关于该JSON Schema⽂件的描述信息
type表⽰待校验元素的类型(例如,最外层的type表⽰待校验的是⼀个JSON对象,内层type分别表⽰待校验的元素类型为,整数,字符串,数字)
properties定义待校验的JSON对象中,各个key-value对中value的限制条件
requiredv定义待校验的JSON对象中,必须存在的key
minimum⽤于约束取值范围,表⽰取值范围应该⼤于或等于minimum
exclusiveMinimum如果minimum和exclusiveMinimum同时存在,且exclusiveMinimum的值为true,则表⽰取值范围只能⼤于minimum maximum⽤于约束取值范围,表⽰取值范围应该⼩于或等于maximum
exclusiveMaximum如果maximum和exclusiveMaximum同时存在,且exclusiveMaximum的值为true,则表⽰取值范围只能⼩于maximum multipleOf⽤于约束取值,表⽰取值必须能够被multipleOf所指定的值整除
maxLength字符串类型数据的最⼤长度
minLength字符串类型数据的最⼩长度
pattern使⽤正则表达式约束字符串类型数据
2. JSON Schema关键字详解
例⼀:涉及的关键字($schema、title、description、type、properties、required)json值的类型有哪些
完整的python代码:
# 导⼊验证器
from jsonschema import validate
# 编写schema:
my_schema = {
"$schema": "/draft-04/schema#",
"title": "TestInfo",
"description": "some information about test",
"type": "object",
"properties": {
"name": {
"description": "Name of the test",
"type": "string"
},
"age": {
"description": "age of test",
"type": "integer"
}
},
"required": [
"name", "age"
]
}
# json数据:
json_data = {
"name": "python",
"age": 25
}
# 验证:
validate(instance=json_data, schema=my_schema)
validate() 函数将⾸先验证所提供的模式本⾝是否有效,因为不这样做会导致不太明显的错误消息,并以不太明显或⼀致的⽅式失败。然后再验证json数据。
如果JSON数据实例是⽆效的,则抛出 ptions.ValidationError 异常
如果schema模式本⾝是⽆效的,则抛出 ptions.SchemaError 异常
2.1 $schema
该关键字⽤于指定JSON Schema版本信息,例⼀中指定的版本为:draft-04。该关键字是可以省略的,当前最新版本为draft-07。注意:该关键字的值必须使⽤官⽅提供的值,不能⾃⼰随便写。
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
}
3 type常见取值
那么,type⼜有哪些取值呢?当type取值为string类型的时候,是否还可以添加其他⼀些附加限制条件呢?我们接下来会按照type的不同取值⼀点点分析涉及到的关键字含义及⽤法。⾸先,我们来看⼀下,type常见的取值。具体如下:
type取值对应的python数据类型
object Object
array List
integer int
number float或int
null None
boolean.Boolean
string String
在上表中,我们采⽤了和Java数据类型对⽐分析的形式给出了type的常见取值,接下来,我们会分析当type为不同取值时,可能涉及的关键字含义和⽤法。
3.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 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"
]
}
3.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
该关键字的值是⼀个有效的JSON Schema。
需要注意的是,该关键字只有在items关键字的值为⼀组有效的JSON Schema的时候,才可以使⽤,⽤于规定超出items中JSON Schema总数量之外的待校验JSON数组中的剩余的元素应该满⾜的校验逻辑。当然了,只有这些剩余的所有元素都满⾜additionalItems的要求时,待校验JSON数组才算通过校验。
其实,你可以这么理解,当items的值为⼀组有效的JOSN Schema的时候,⼀般可以和additionalItems关键字组合使⽤,items⽤于规定对应位置上应该满⾜的校验逻辑,⽽additionalItems⽤于规定超出items校验范围的所有剩余元素应该满⾜的条件。如果⼆者同时存在,那么只有待校验JSON数组同时通过⼆者的校验,才算真正地通过校验。
另外,需要注意的是,如果items只是⼀个有效的JSON Schema,那么就不能使⽤additionalItems,原因也很简单,因为items为⼀个有效的JSON Schema的时候,其规定了待校验JSON数组所有元素应该满⾜的校验逻辑。additionalItems已经没有⽤武之地了。
最后,同样强调⼀下,省略该关键字和该关键字的值为空JSON Schema,具有相同效果。
如果⼀个additionalItems的值如下:
{
"type": "array",
"items": [
{
"type": "string",
"minLength": 5
},
{
"type": "number",
"minimum": 10
}
],
"additionalItems": {
"type": "string",
"minLength": 2
}
}
上⾯的JSON Schema的意思是,待校验JSON数组第⼀个元素是string类型,且可接受的最短长度为5个字符,第⼆个元素是number类型,且可接受的最⼩值为10,剩余的其他元素是string类型,且可接受的最短长度为2。那么,下⾯三个JSON数组是能够通过校验的,具体内容如下:
["green", 10, "good"]
["green", 11]
["green", 10, "good", "ok"]
下⾯JSON数组是⽆法通过校验的,具体内容如下:
["green", 10, "a"]
["green", 10, "ok", 2]
minItems、maxItems
这两个关键字的值都是⾮负整数。
指定了待校验JSON数组中元素的个数限制,minItems指定了待校验JSON数组可以接受的最少元素个数,⽽maxItems指定了待校验JSON 数组可以接受的最多元素个数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论