本文概览:介绍json schema和一个工具 https://github.com/xeipuuv/gojsonschema
1 Json Schema 介绍
1.1 Json Schema是什么
以golang为例,比如定义了一个struct
1 2 3 4 |
type RuleInfo struct { Name string Level string } |
创建一个实例就是
1 2 3 4 |
instance := RuleInfo{ Name:"降级", "Level":2, } |
如果把json看成一个实例对象,那么Json Schema 可以看成是json对象的struct定义。Json Schema 本身是用 Json编写的。
1.2 Json Schema作用
json-schema,是用 json 的格式来定义 json 结构的方法,可以通过 json-schema 的定义规则,来检查一个 json 结构是否符合预期。
2 Json schema 常用的在线工具
- 根据 json 生成 schema — tooltt.com/json2schema…
- 校验 jsonschema 是否合法 — www.jsonschemavalidator.net/
- 校验某个 json 是否符合指定的 json schema 定义 — www.jsonschemavalidator.net/
3 Json Schema规则
以下表格整理了常用的 json schema 的关键:https://juejin.cn/post/7086808573027549197
关键字 | 描述 |
---|---|
$schema | 说明是哪个版本的 Json Schema,不同版本间不完全兼容 |
title | 用于进行简单的描述,可以省略 |
description | 用于进行详细的描述信息,可以省略 |
type | 用于约束 json 的字段类型、string、number\integer、object、array、boolean |
properties | 定义属性字段,定义每个字段的键和值类型 |
required | 必需属性,数组类型,指定上述 properties 中哪些是必需的字段 |
minimum | type 为 integer 时,可被接受的最小值 |
maximum | type 为 integer 时,可被接受的最大值 |
maxLength | type 为 string 或 array 时,可被接受的最小长度 |
minLength | type 为 string 或 array 时,可被接受的最大长度 |
uniqueItems | type 为 array 时,数组元素时否唯一 |
pattern | type 为 string 时,将字符串限制为特定的正则表达式 |
enum | 用于将值限制为一组固定的值,其至少含有一个元素,且所含元素必须唯一 |
additionalProperties | 将用于验证与 properties 不匹配的属性是否被允许 |
patternProperties | 将正则表达式映射到模式。如果属性名称与给定的正则表达式匹配,则属性值必须符合定义的类型 |
allOf | (AND) 必须对「所有」子模式有效 |
anyOf | (OR) 必须对「任意」子模式有效 |
oneOf | (XOR) 必须对「恰好一个」子模式有效 |
举例 定义一个json规则 json_schema
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
{ "$schema": "https://json-schema.org/draft-04/schema#", "type": "object", "properties": { "name": { "type": "string" }, "hobbies": { "type": "array", "minItems": 1, "uniqueItems": true }, "additionInformation": { "oneOf": [{ "type": "string", "enum": ["xian", "shanghai"] }, { "type": "integer", "minimum": 0, "maximum": 150 } ] } }, "patternProperties": { "^Is.*": { "type": "boolean" } }, "required": ["name", "hobbies"], "additionalProperties": false } |
一个json数据
1 2 3 4 5 6 7 |
{ "name": "xiyan", "hobbies": [ "coding" ], "additionInformation": "xian" } |
判断这个json数据是否满足规则,使用在线工具https://www.jsonschemavalidator.net/
4 使用SDK
工具地址:https://github.com/xeipuuv/gojsonschema
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package main import ( "fmt" "github.com/xeipuuv/gojsonschema" ) func main() { schemaLoader := gojsonschema.NewReferenceLoader("file:///home/me/schema.json") documentLoader := gojsonschema.NewReferenceLoader("file:///home/me/document.json") result, err := gojsonschema.Validate(schemaLoader, documentLoader) if err != nil { panic(err.Error()) } if result.Valid() { fmt.Printf("The document is valid\n") } else { fmt.Printf("The document is not valid. see errors :\n") for _, desc := range result.Errors() { fmt.Printf("- %s\n", desc) } } } |