最近在处理安卓配置项目中,某个vue下Vue JSON Schema Form插件的使用(可以动态根据json生成表单及校验),该插件主要是根据
JSON Schema
来生成表单。JSON Schema
是一种跟JSON有关的数据,描述JSON的数据结构和依赖关系。可以用来做数据数据校验,也可以同时结合配合jsv
、tv4
等二方校验工具,实现接口测试自动化。
JSON Schema
关键字 type
type 的作用是用来限制类型的。可以设置的值为:string
,number
,object
,array
,boolean
,null
简单使用如下:
{
"type": "object",
"properties": {
"first_name": { "type": "string" },
"last_name": { "type": "string" },
"birthday": { "type": "string", "format": "date" },
"address": {
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" },
"country": { "type" : "string" }
}
}
}
}
复制代码
常用类型及相关参数配置
string
:
- 长度:
minLength
和maxLength
关键字来限制字符串的长度
{"type": "string", "minLength": 2, "maxLength": 3}
"A" 错误
"AB" 正确
复制代码
- 正则匹配:
pattern
关键字用于将字符串限制为特定的正则表达式
{ "type": "string", "pattern": "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$" }
"(888)555-1212" 正确
"(888)555-1212 ext. 532" 错误
复制代码
integer
/number
:
- 倍数:
multipleOf
关键字将数字限制为给定数字的倍数 。它可以设置为任何正数。
{
"type": "number",
"multipleOf" : 10
}
0 错误
10 正确
11 错误
复制代码
minimum
和maximum
关键字的组合指定的,数字的范围
{
"type": "number",
"minimum": 0,
"maximum": 100,
}
-1 错误
1 正确
复制代码
object
:
- 属性:对象的属性(键值对)是使用
properties
关键字定义。properties
的值是一个对象,其中每个键是属性的名称,每个值是用于验证该属性的模式。此properties
关键字将忽略与关键字中的任何属性名称不匹配的任何属性。
{
"type": "object",
"properties": {
"number": { "type": "number" },
"street_name": { "type": "string" },
"street_type": { "enum": ["Street", "Avenue", "Boulevard"] }
}
}
{
"number": 1600,
"street_name": "Pennsylvania",
"street_type": "Avenue"
} 正确
{
"number": "1600",
"street_name": "Pennsylvania",
"street_type": "Avenue"
} 错误 提供的号码类型错误,则无效
复制代码
patternProperties
:给定一种特定类型的属性名称,该值应该与特定模式相匹配。
{
"type": "object",
"patternProperties": {
"^S_": { "type": "string" },
"^I_": { "type": "integer" }
}
}
{ "S_25": "This is a string" } 正确
{ "I_0": 42 } 正确
{ "S_0": 42 } 错误 如果名称以 开头S_,则必须是字符串
复制代码
additionalProperties
:其名称不属于,列出的properties
关键字或任何相匹配的正则表达式的patternProperties
关键字。默认情况下,允许任何其他属性
{
"type": "object",
"properties": {
"number": { "type": "number" },
"street_name": { "type": "string" },
"street_type": { "enum": ["Street", "Avenue", "Boulevard"] }
},
"additionalProperties": false
}
{
"number": 1600,
"street_name": "Pennsylvania",
"street_type": "Avenue"
} 正确
{
"number": 1600,
"street_name": "Pennsylvania",
"street_type": "Avenue",
"direction": "NW"
} 错误 额外属性“direction”使对象无效
复制代码
required
提供所需属性的列表,必需字段
{
"type": "object",
"properties": {
"name": { "type": "string" },
"email": { "type": "string" },
},
"required": ["name", "email"]
}
{
"name": "William Shakespeare",
"email": "bill@stratford-upon-avon.co.uk"
} 正确
{
"name": "William Shakespeare",
} 错误,少了一个email字段
复制代码
minProperties
和maxProperties
关键字来限制对象上的属性数量
{
"type": "object",
"minProperties": 2,
"maxProperties": 3
}
{} 错误,至少2个属性
{ "a": 0 } 错误
{ "a": 0, "b": 1 } 正确
复制代码
array
:
- 一般使用
{ "type": "array" }
[1, 2, 3, 4, 5] 正确
[3, "different", { "types" : "of values" }] 正确
{"Not": "an array"} 错误,是个对象
复制代码
items
关键字设置为单个模式,将用于验证数组中所有元素。
{
"type": "array",
"items": {
"type": "number"
}
}
[1, 2, 3, 4, 5] 正确
[1, 2, "3", 4, 5] 错误单个“非数字”会导致整个数组无效
[] 正确,空数组始终有效
复制代码
- 元组验证,每个数组所对应索引都可以设置不同类型
{
"type": "array",
"items": [
{ "type": "number" },
{ "type": "string" },
{ "enum": ["Street", "Avenue", "Boulevard"] },
{ "enum": ["NW", "NE", "SW", "SE"] }
]
}
[1600, "Pennsylvania", "Avenue", "NW"] 正确
[24, "Sussex", "Drive"] 错误,“Drive”不是索引2里面得枚举成员
["Palais de l'Élysée"] 错误,第一个元素需要是数字
[10, "Downing", "Street"] 正确,可以不提供要求的成员,但是得按照索引顺序省略
[1600, "Pennsylvania", "Avenue", "NW", "Washington"] 正确,默认情况下可以在尾部添加其他额外数据类型
复制代码
additionalItems
设置需要的额外属性,不设置可以直接使用false
,否则需要设置对应额外属性类型minItems
和maxItems
指定数组的长度
{
"type": "array",
"minItems": 2,
"maxItems": 3
}
[] 正确
[1] 错误,数组长度不对
[1, 2] 正确
复制代码
uniqueItems
关键字设置为true
,可以限制数组中的每个元素都是唯一的。
{
"type": "array",
"uniqueItems": true
}
[1, 2, 3, 4, 5] 正确
[1, 2, 3, 3, 4] 错误,多了一个3
[] 正确 空数组总是通过
复制代码
boolean
:
- 布尔类型只匹配两个特殊值:
true
和false
{ "type": "boolean" }
true 正确
false 正确
"true" 错误
0 错误
复制代码
null
:
- 当一个模式指定
type
为null
时,它只有一个可接受的值:null
。
常用的通用关键字
title
和description
关键字必须是字符串。title
最好是简短的,而description
提供模式描述的数据因此会有更长的说明。default
关键字指定一个默认值enum
关键字用于将值限制为一组固定的值。它必须是一个包含至少一个元素的数组,其中每个元素都是唯一的。schema
组成(allOf
,anyOf
,oneOf
,not
)
allOf
:全部满足
{
"allOf": [
{ "type": "string" },
{ "maxLength": 5 }
]
}
"short" 正确
"too long" 错误
复制代码
anyOf
:满足其中一个
{
"anyOf": [
{ "type": "string", "maxLength": 5 },
{ "type": "number", "minimum": 0 }
]
}
"short" 正确
"too long" 错误
12 正确
-5 错误
复制代码
oneOf
:满足且只满足一个
{
"oneOf": [
{ "type": "number", "multipleOf": 5 },
{ "type": "number", "multipleOf": 3 }
]
}
10 正确
9 正确
2 错误,两个都不满足
15 错误,两个都满足
复制代码
not
: 不是这个类型就行
{ "not": { "type": "string" } }
10 正确
{"key":1} 正确
"1" 错误
复制代码