1. 引言
什么是Json Schema? 以一个例子来说明
假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友。一个请求的例子如下:
{
"city" : "chicago",
"number": 20,
"user" : {
"name":"Alex",
"age":20
}
}
在上面的例子中,web api要求提供city,number,user三个成员,其中city是字符串,number是数值,user是一个对象,又包含了name和age两个成员。
对于api来说,需要定义什么样的请求合法,即什么样的Json对于api来说是合法的输入。这个规范可以通过Json Schema来描述,对应的Json Schema如下。
{
"type": "object",
"properties": {
"city": { "type": "string" },
"number": { "type": "number" },
"user": {
"type": "object",
"properties": {
"name" : {"type": "string"},
"age" : {"type": "number"}
}
}
}
}
什么是Json Schema?
Json Schema定义了一套词汇和规则,这套词汇和规则用来定义Json元数据,且元数据也是通过Json数据形式表达的。Json元数据定义了Json数据需要满足的规范,规范包括成员、结构、类型、约束等。
本文后面的部分是简要介绍Json Schema定义的这些规则,以及如何用这些规则描述规范。
Json Schema定义了一系列关键字,元数据通过这些关键字来描述Json数据的规范。其中有些关键字是通用的;有些关键字是针对特定类型的;还有些关键字是描述型的,不影响合法性校验。本文的主要内容就是介绍这些关键字的应用。
2. 类型关键字
首先需要了解的是"type"关键字,这个关键字定义了Json数据需要满足的类型要求。"type"关键字的用法如下面几个例子:
{"type":"string"}。规定了Json数据必须是一个字符串,符合要求的数据可以是
"Today is a good day."
"I love you"
{"type" : "object"}。规定了Json数据必须是一个对象,符合要求的数据可以是
{"name" : "Alexander", "age" : 98}
{}
{"type" : "number"}。规定了Json数据必须是一个数值,符合要求的数据可以是。Java Script不区分整数、浮点数,但是Json Schema可以区分。
2
0.5
{"type": "integer"}。要求数据必须是整数。
2
{"type" : "array"}。规定了Json数据必须是一个数组,符合要求的数据可以是
["abc", "cdf"]
[1, 2, 3]
["abc", 25, {"name": "Alexander"} ]
[]
{"type" : "boolean"}。这个Json Schema规定了Json数据必须是一个布尔,只有两个合法值
true
false
{"type" : "null"}。null类型只有一个合法值
null
3. 简单类型
这部分介绍类型特定的关键,包括字符串、数值、布尔、空值几种基本类型。
3.1 字符串
Json合法的字符串
"Today is a good day."
对应的Json Schema
{"type": "string"}
可以进一步对字符串做规范要求。字符串长度、匹配正则表达式、字符串格式。
3.1.1 字符串长度
关键字: minLength, maxLength
可以对字符串的最小长度、最大长度做规范。
{
"type" : "string",
"minLength" : 2,
"maxLength" : 3,
}
3.1.2 正则表达式
关键字: pattern
可以对字符串应满足的Pattern做规范,Pattern通过正则表达式描述。
{
"type" : "string",
"pattern" : "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$",
}
3.1.3 字符串For