JSON Schema

·  阅读 86

最近在处理安卓配置项目中,某个vue下Vue JSON Schema Form插件的使用(可以动态根据json生成表单及校验),该插件主要是根据JSON Schema来生成表单。JSON Schema是一种跟JSON有关的数据,描述JSON的数据结构和依赖关系。可以用来做数据数据校验,也可以同时结合配合 jsvtv4 等二方校验工具,实现接口测试自动化。


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 错误
复制代码
  • minimummaximum关键字的组合指定的,数字的范围
{ 
    "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字段
复制代码
  • minPropertiesmaxProperties关键字来限制对象上的属性数量
{
  "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:

  • 当一个模式指定 typenull时,它只有一个可接受的值:null

常用的通用关键字
  • titledescription关键字必须是字符串。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" 错误
复制代码

参考链接:Understanding JSON Schema

分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改