# JSON Schema 入门介绍及应用

# 简介

JSON(JavaScript Object Notation),是一种数据格式,具有简洁、可读性高、支持广泛的特点。

JSON Schema 是基于JSON格式,用于定义 JSON 数据结构以及校验 JSON 数据内容。JSON Schema 官网地址 (opens new window)

栗子:

有 JSON 数据:

{
  "name": "蕾某",
  "birthday": "02-02",
  "height": "154cm"
}
1
2
3
4
5

通过 JSON Schema 描述:

 {
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "birthday": { "type": "string", "format": "date" },
    "height": { "type": "string" }
  }
}
1
2
3
4
5
6
7
8

通过上面我们可以看到,使用 JSON Schema 可以清晰的对 JSON 数据进行描述,因此非常适合拿来对数据进行校验。比如自定义表单数据的验证(ajv (opens new window)),或者使用 JSON Editor (opens new window) 的时候验证输入的数据。

# 关键字

关键字 描述
$schema 表示该JSON Schema文件遵循的规范(可选,最新 2019-09
title 为该JSON Schema文件提供一个标题(可选)
description 关于该JSON Schema文件的描述信息(可选)
type 表示待校验元素的类型(例如,最外层的type表示待校验的是一个JSON对象,内层type分别表示待校验的元素类型为,整数,字符串,数字)
properties 定义待校验的JSON对象中,各个key-value对中value的限制条件
required 定义待校验的JSON对象中,必须存在的key
pattern 使用正则表达式约束字符串类型数据
enum 可以在任何类型使用,value 是一个数组,表示 JSON 数据的取值是数组中的某个

type 是核心,所有的验证都是基于它的。可选 string,number,integer,object,array,null,boolean

# string

可用关键字:maxLength、minLength、pattern、format、enum

# 1. 指定 string 类型

{ "type": "string" }
1
"蕾某" // ok
154 // not ok
"154" // ok
1
2
3

# 2. 包含多个类型

{ "type": ["string", "number"] }
1
"蕾某" // ok
154 // ok
"154" // ok
1
2
3

# 3. 限定字符串长度

{
  "type": "string",
  "minLength": 2,
  "maxLength": 3
}
1
2
3
4
5
"蕾" // not ok
"蕾某" // ok
"154" // ok
"02-02" // not ok
1
2
3
4

# 4. 正则匹配

{
  "type": "string",
  "pattern": "^[0-9]{2}.[0-9]{2}$"
}
1
2
3
4
"蕾某" // not ok
"154" // not ok
"02-02" // ok
1
2
3

# 5. 枚举

{
    "type": "string",
    "enum": ["蕾某", "蕾"]
}
1
2
3
4
"蕾某" // not ok
"蕾" // ok
"154" // not ok
1
2
3

# 6. 内置验证

支持 date-time,time,date,email,hostname,ipv4,ipv6,uri,uri-reference,regex

文档: format (opens new window)

{
    "type": "string",
    "format": "date"
}
1
2
3
4
"蕾某" // not ok
"2020-08-27" // ok
"02-02" // not ok
1
2
3

# number

可用关键字:multipleOf、maximum、exclusiveMaximum、minimum、exclusiveMinimum

{ "type": "number" }, 数值类型,可以是整数,也可以是浮点数;

{ "type": "integer" }, 整数类型的 number;

{
  "type": "number",
  "multipleOf": 10,
  "minimum": 10,
  "maximum": 100,
  "exclusiveMaximum": true
}
1
2
3
4
5
6
7
154 // not ok,因为 multipleOf ,不能被 10 整除
10 // ok,因为 minimum ,最小值 10
100 // not ok,因为 exclusiveMaximum ,不包含最大值 100
1
2
3

# 6.

# object

可用关键字:properties、required、minProperties、maxProperties、propertyNames、dependencies、patternProperties、additionalProperties

# 不允许有额外字段

{
    "type": "object",
    "properties": {
        "name": { "type": "string" },
        "birthday": { "type": "string" },
        "height": { "type": "string" }
    },
    "additionalProperties": false
}
1
2
3
4
5
6
7
8
9

只能有 name,birthday,height 四个字段。

# 允许有额外字段并限定

{
    "type": "object",
    "properties": {
        "name": { "type": "string" },
        "birthday": { "type": "string" },
        "height": { "type": "string" }
    },
    "additionalProperties": { "type": "string" }
}
1
2
3
4
5
6
7
8
9

可以有额外字段,但必须是 string 类型。

# 必填字段

{
    "type": "object",
    "properties": {
        "name": { "type": "string" },
        "birthday": { "type": "string" },
        "height": { "type": "string" }
    },
    "required": ["name", "birthday"]
}
1
2
3
4
5
6
7
8
9

name,birthday 必须有,允许有额外字段。

# 限定字段个数

{
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    },
    "minProperties": 2,
    "maxProperties": 3
}
1
2
3
4
5
6
7
8

需要有 2~3 个字段,不能多,不能少。

# 批量定义字段

通过正则表达式匹配字段名。

{
    "type": "object",
    "patternProperties": {
        "^S_": { "type": "string" },
        "^I_": { "type": "integer" }
    },
    "additionalProperties": false
}
1
2
3
4
5
6
7
8
{ "S_25": "This is a string" } // ok
{ "I_0": 42 } // ok
{ "I_42": "This is a string" } // not ok
1
2
3

#

# 参考

上次更新: 9/30/2020, 10:12:02 PM