一、简介
我们先看下面的json数据
{
"id": 1,
"name": "g2",
"desc":"b2"
}
假设, 我们要求id为long型, id、name非空。desc可空。如何衡量json数据是有效的呢?现在流行的json schema 是用来校验json数据是否合法。
详情请移至 https://spacetelescope.github.io/understanding-json-schema/
二、keyWords介绍
1、keyWords速记表
关键词 | 注释 |
---|---|
$schema | 声明当前文档是标准的 JSON Schema 文档,当然,这个关键词并不是必需的。 |
title | 题目, 不是必须的 |
description | 描述,不是必须的 |
type | 属性类型, eg : 字符、数字 |
properties | json串出现的属性 |
patternProperties | 正则表达匹配 json串出现的属性 |
additionalProperties | ①、true : json串可以出现除schema定义之外属性 ②、false :json串不可以出现除schema定义之外属性additionalProperties": { "type": "string" }json串可以出现除schema定义之外"字符"属性 |
required | 存放必要属性列表。json串必须出现required要求的属性 |
dependencies | 依赖出现 |
size | 属性个数 |
minimum | 给值设置的约束条件,表示可以接受的最小值。 |
exclusiveMinimum | true : 不包括最小值 |
maximum | 给值设置的约束条件,表示可以接受的最大值。 |
exclusiveMaximum | true : 不包括最大值 |
multipleOf | 如果通过这个关键字的值分割实例的结果是一个数字则表示紧靠 "multipleOf" 的数字实例是有效的。 |
2、具体使用如下
type关键字
①、type = object, properties关键字是必需的。
②、type = array, items关键字是必需的。
porperties关键字
{
type: "object";
properties: {
number: { type: "number" };
name: { type: "string" };
};
}
additionalProperties关键字
"additionalProperties": false :json串只能出现schema定义的属性。
"additionalProperties": { "type": "string" } :json串能出现不在schema定义范围内的属性, 但属性的类型必须为string
{
type: "object";
properties: { number: { type: "number" }; name: { type: "string" } };
additionalProperties: false;
}
required关键字
"required": ["name"] : json串必须出现name属性
{
type: "object";
properties: { number: { type: "number" }; name: { type: "string" } };
additionalProperties: false;
required: ["name"];
}
dependencies关键字
dependencies": {
"number": ["name"]
}
number的出现必须依赖在name的基础上, 换而言之 , number出现,则name必须出现;name的出现与number并没有毛关系
{
type: "object";
properties: { number: { type: "number" }; name: { type: "string" } };
additionalProperties: false;
required: ["name"];
dependencies: { number: ["name"] };
}
patternProperties关键字
"patternProperties": {
"^S_": { "type": "string" },
"^I_": { "type": "integer" }
}
以s、I开头的属性必须是String类型
{
type: "object";
properties: { number: { type: "number" }; name: { type: "string" } };
additionalProperties: false;
required: ["name"];
dependencies: { number: ["name"] };
patternProperties: {
"^S_": { type: "string" };
"^I_": { type: "integer" };
};
}
enum关键字
{
type: "string";
enum: ["red", "amber", "green"];
}
anyOf关键字
anyOf: 对所有属性范畴生效。所有属性字符串长度最大不能》5
{
"anyOf": [
{ "type": "string", "maxLength": 5 },
{ "type": "number", "minimum": 0 }
]
}
allOf关键字
allOf : type必须相同。不能即String、又number
{
allOf: [{ type: "string" }, { maxLength: 5 }];
}
oneOf关键字
{
"type": "number",
"oneOf": [
{ "multipleOf": 5 },
{ "multipleOf": 3 }
]
}
**not关键字****
{
"not": {
"type": "string"
}
}
$schema关键字
schema : 声明json片段是json schema模式, 并不是 普通json串, 同时也声明了json schema版本
三、拓展
1、复用
{
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" }
},
"required": ["street_address", "city", "state"]
}
如果我们想复用上述的json串, 可以使用definitions关键字。json结构定义如下 :
{
"definitions": {
"address": {
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" }
},
"required": ["street_address", "city", "state"]
}
}
}
如何引用 ? 可以使用$ref关键字
{ "$ref": "#/definitions/address" }
或者
{ "$ref": "definitions.json#/address" }
例子如下 :
schema定义
{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
"address": {
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" }
},
"required": ["street_address", "city", "state"]
}
},
"type": "object",
"properties": {
"billing_address": { "$ref": "#/definitions/address" },
"shipping_address": { "$ref": "#/definitions/address" }
}
}
目标匹配json数据
{
"shipping_address": {
"street_address": "1600 Pennsylvania Avenue NW",
"city": "Washington",
"state": "DC"
},
"billing_address": {
"street_address": "1st Street SE",
"city": "Washington",
"state": "DC"
}
}
2、延伸属性
json schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
"address": {
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" }
},
"required": ["street_address", "city", "state"]
}
},
"type": "object",
"properties": {
"billing_address": { "$ref": "#/definitions/address" },
"shipping_address": {
"allOf": [
{ "$ref": "#/definitions/address" },
{ "properties":
{ "type": { "enum": [ "residential", "business" ] } },
"required": ["type"]
}
]
}
}
}
可匹配json
{
"shipping_address": {
"street_address": "1600 Pennsylvania Avenue NW",
"city": "Washington",
"state": "DC",
"type": "business"
}
}