JSON Schema Validation

1,217 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

什么是 JSON Schema

JSON Schema 是一套用来规范前后端 JSON 数据格式的一种约定方案。JSON Schema 是用于验证 JSON 数据结构的强大工具,Schema可以理解为模式或者规则。

基本数据类型

类型名称示例
string字符串"String"
number数字1
boolean布尔true, false
nullnull
array数组["item1", "item2"]
Object对象{ "xx1": 10, "xx2": "string" }

JSON Schema 类型通用校验属性

属性                                            属性值                                                                  描述示例
typestring/array此关键字的值必须是字符串或数组。如果它是一个数组,则数组的元素必须是字符串并且必须是唯一的。字符串值必须是六种基本类型之一(“null”、“boolean”、“object”、“array”、“number”或“string”),或匹配任何小数部分为零的数字的“integer” .
enumarray关键字的值必须是一个数组。这个数组应该至少有一个元素。数组中的元素应该是唯一的。 数组中的元素可以是任何类型,包括 null{ "enum": ["red", "amber", "green"] }
const任何类型此关键字的值可以是任何类型,包括 null。
titlestring标题meta-data 这些通用注释关键字为文档和用户界面显示目的提供常用信息。它们并非旨在形成一套全面的功能。
descriptionstring描述
defaultany默认值
examplesarray数据示例
readOnlyboolean
writeOnlyboolean

Number类型校验属性

属性                                    属性值描述
exclusiveMaximumnumber"exclusiveMaximum" 的值必须是一个数字,表示数字实例的独占上限。
exclusiveMinimumnunber“exclusiveMinimum”的值必须是一个数字,代表一个数字实例的独占下限。
maximumnumber"maximum" 的值必须是一个数字,表示数字实例的包含上限。
minimumnumber“minimum”的值必须是一个数字,代表一个数字实例的包含下限。
multipleOfnumber(number>0)"multipleOf" 的值必须是一个数字,严格大于 0。仅当除以此关键字的值得到整数时,数字实例才有效。

String类型校验属性

属性                  属性值         描述
minLength非负整数关键字的值必须是非负整数
maxLength非负整数关键字的值必须是非负整数
patternstring关键字的值必须是字符串。根据 ECMA-262 正则表达式方言,这个字符串应该是一个有效的正则表达式。

Array类型校验属性

属性                                                                                                   属性值                                                      描述
maxItems非负整数如果数组实例的大小小于或等于此关键字的值,则数组实例对“maxItems”有效。
minItems非负整数如果数组实例的大小大于或等于此关键字的值,则数组实例对“minItems”有效。省略此关键字与值为 0 具有相同的行为。
uniqueItemsboolean如果此关键字的布尔值为 false,则实例验证成功。如果它具有布尔值 true,则如果其所有元素都是唯一的,则该实例将成功验证
maxContains非负整数如果同一模式对象中不存在“包含”,则此关键字无效。实例数组对“maxContains”有两种有效方式,具体取决于相邻 “contains” [ json-schema ]关键字的注释结果的形式。第一种方法是如果注释结果是一个数组并且该数组的长度小于或等于“maxContains”值。第二种方法是如果注释结果是布尔值“true”并且实例数组长度小于或等于“maxContains”值。
minContains非负整数如果同一模式对象中不存在“包含”,则此关键字无效。实例数组对“minContains”有两种有效方式,具体取决于相邻 “contains” [ json-schema ]关键字的注释结果的形式。第一种方法是如果注释结果是一个数组并且该数组的长度大于或等于“minContains”值。第二种方法是如果注释结果是布尔值“true”并且实例数组长度大于或等于“minContains”值。允许值 0,但仅用于设置从 0 到“maxContains”值的出现范围。值 0 会导致“minContains”和“contains”始终通过验证(但验证仍可能因“maxContains”关键字而失败)。省略此关键字与值为 1 的行为相同。
contain
items描述数组中每一项的约束。是一种模式的设置。

Object类型校验属性

属性                                             属性值                           描述
maxProperties非负整数如果对象实例的属性数小于或等于此关键字的值,则对象实例对“maxProperties”有效。
minProperties非负整数如果对象实例的属性数量大于或等于此关键字的值,则对象实例对“minProperties”有效。
requiredarray每个数组中的元素(如果有)必须是字符串,并且必须是唯一的。如果数组中的每个项目都是实例中属性的名称,则对象实例对该关键字有效。
dependentRequiredobject此对象中的属性(如果有)必须是数组。每个数组中的元素(如果有)必须是字符串,并且必须是唯一的。

扩展format校验属性

1. 为何需要扩展format字段: 单独的结构验证可能不足以让应用程序正确利用某些值。

属性属性值描述示例
formatstring{ "format": { "type": "string" } }format-annotation

2. formta字段可以和JSON Schema中定义的任何数据类型配合使用。

本节中定义的所有格式属性都适用于字符串,但可以指定格式属性以适用于 核心 JSON 模式中定义的数据模型中定义的任何实例类型。[ json模式] 请注意,本规范中的“type”关键字定义了一个“integer”类型,它不是数据模型的一部分。因此,格式属性可以限制为数字,但不限于整数。但是,数字格式可以与值为“integer”的“type”关键字一起使用,或者如果数字不是整数,则可以显式定义为始终传递,这与仅应用于整数的行为基本相同。

3. 主要用作注释,但可以选择用作断言。

断言:应用于实例时产生布尔结果

注释:将信息附加到实例以供应用程序使用

总结

通过JSON Schema validation文章的描述。收集整理不同类型下的字段属性。

参考文章

json-schema-validation