简单说,Json Schema
其实就是一个标准的 Json 串,它以一个 Json 串来描述我们需要的数据规范,并且支持注释以及验证 Json 文档,即我们可以用 Json Schema 来验证所给的 Json 串是否满足我们需要的数据格式规范。
同样能用来表示数据的还有一种格式 XML,为什么 Json Schema 偏偏要用 Json 来进行表示数据呢?对于机器,其实这两种方式是没有区别的,机器只要你把标准给了它,它都能用很快的速度识别出来(相对于我们人),但是 XML 对于人识别就太不友好了。比如,假设我们需要描述一个班级的两个人:
对于 XML:
1 | <class> |
使用 Json:
1 | { |
有没有觉得 Json 立马秒杀 XML?这里可能感觉还不是很明显,这是因为层级比较少,层级再多之后,Json 的优势立马就显现出来了。
Json Schema 在我们平时的工作中最常用的有两个,一个就是上面说的用于验证 Json 串的合法性;另一个就是用于定义我们的 API,定义好 API 后,我们可以直接用工具生成我们的 API,这样利于我们对 API 的维护。
验证 Json 串的合法性
比如,我们定义的 Json Schema 为:
1 | { |
在上述 Json Schema 中
- 最上面的
$shcema
是一个关键字,它表示我们所定义的 Schema 和http://json-schema.org/draft-04/schema#
(Json Schema 的 v4 规范)是一致的 title
指的是标题。description
用于描述我们所定义的 Schema,上述表明我们定义的是一个来自 Acme 目录的商品。type
表示我们定义的是一个object
对象。properties
中就是 Schema 的属性了,这里面的是核心。我们可以看到该 Schema 一共有三个属性,分别是 id(integer)
, name(string)
, prince(number)
。- 最后的
required
表明三个属性都是必须的。
给定了上述 Schema,我们就可以验证给定的 Json 是否是合规的了。比如:
1 | { |
显然,这个 Json 缺少了一个属性 price,所以它不合规。
1 | { |
这个 Json 的 name 属性是一个数组,我们上面规定 name 只能是 String,显然这个也不是合规的。
1 | { |
这个,就满足了上面定义的所有规则,因此这个是一个合规的 Json。
定义 API
其实,使用我们上面的 Json Schema 便能进行 API 的定义了,只不过是定义 API 的话可能还需要更多的支持。比如,对于 Java,我们需要能实现 extend 等关键字的支持,还需要能进行枚举 enum 类型等的定义。这里只简单使用上述的内容显然不够了,我们还需要扩充一些关键字的使用。
目前,大家使用最多的将 Json Schema 转换为 Java Bean 的一个库是 jsonschema2pojo,后面我将依托这个库支持的内容对 Json Schema 的格式进行深入解析,此库支持的也是比较通用的。