JSON Schema官网

文章目录

  • 1:JSON Schema简介
    • 1.1:基础知识
    • 1.2:定义关键字解释
      • 1:$schema
  • 2:type支持数据类型
    • 2.1:string字符串
      • 1:正则表达式
    • 2.2:数字类型
    • 2.3:object对象
    • 2.4:数组
    • 2.5:boolean
    • 2.6:架构组合
      • 1:allOf 必须都符合
      • 2:anyOf 任何一个符合
      • 3:oneOf 其中一个符合
      • 4:not 都不符合
    • 2.7:处理xml或txt等json数据
    • 2.8:条件属性绑定
    • 2.9:结构复杂组合示例
    • 2.10:type支持的通用参数
  • 3:构造一个复杂的schema(ref和ref和ref和def)
    • 1:$ref关键字
  • 4:JSON Schema开发实战
    • 4.1:everit-org验证器
      • 1:maven开发依赖
      • 2:demo
    • 4.2:json-schema-validator校验器
      • 1:maven依赖

1:JSON Schema简介

学习json schema基础
和XML Schema用来验证xml数据结构一样,jsonSchema是验证JSONdata数据结构的强大工具。
如果不会写有自动生成工具:https://www.jsonschema.net/login

1.1:基础知识

在JSON模式中,空对象和true都是完全有效的模式,可以接受任何有效的JSON。

  • a.json文件
{ }          或者true

1.2:定义关键字解释

架构关键字:$schema and $id.$schema该关键字用于指定JSON Schema版本信息Id是唯一标识产品的数值。因为这是产品的规范标识符,所以它是必需的。
模式注释:title and description. 用来进行注释的,描述文件或者字段
验证关键字:type。定义数据的类型,定义后只支持该特定类型
属性关键字:properties定义该json的属性部分

demo

{"id":"this is json id .","description":"this is test json schema .","properties":{"name":{"type":"string","description":"people name ."}}
}

1:$schema

用于指定版本信息:可在此查看schema版本
共有4;6;7等多个版本,比如6版本

"$schema": "http://json-schema.org/draft-06/schema#",

2:type支持数据类型

string
number
integer
object
array
boolean
null

2.1:string字符串

支持对字符串的长度,正则表达式。对于其他的一些格式,因为json中没有时间,ip等格式,统一为字符串,可以使用format关键字再进行定义。

定义字符串长度范围,值必须是非负数
{"type": "string","minLength": 2,"maxLength": 3
}
  • 支持的参数
长度:minLength,maxLength
正则表达式 :pattern
其他内置格式:对应使用format关键字:   "format":"",日期和时间:date-time;time;date;邮件地址:email;idn-email主机名:hostnameIP:ipv4;ipv6资源标识符:uuid;uri url模板:uri-templatejson指针:JSON Pointer正则表达式:regex

1:正则表达式

string支持正则表达式介绍。正则表达式规则介绍

.:匹配除换行符以外的任何字符。
^:仅在字符串的开头匹配。
$:仅在字符串末尾匹配。
(...):将一系列正则表达式组合成一个正则表达式。
|:匹配前面或后面的正则表达式|符号。
[abc]:匹配方括号内的任何字符。
[a-z]:匹配字符范围内的所有。
[^abc]:匹配字符以外的。
[^a-z]:匹配范围之外的任何字符。
+:匹配前面正则表达式的一个或多个重复。
*:匹配前面正则表达式的零个或多个重复。
?:匹配前面正则表达式的零个或一个重复。
+?,*?,??:该*,+,和?限定词都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不可取的,您希望匹配尽可能少的字符。
(?!十),(?=x):消极和积极的前瞻。
{x}:完全匹配前面x位数正则表达式的出现。
{x,y}:至少匹配x最多y出现在前面位数的正则表达式。
{x,}:匹配x前面正则表达式的一次或多次出现。
{x}?,{x,y}?,{x,}?:上述表达式的懒惰版本。

demo:

{"type": "string","pattern": "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$",
}
//"(888)555-1212"   或者"555-1212"   都是符合的
// ^(([0-9]{3}))?  匹配0-9的数字匹配前3位,执行一次匹配或者0次
// [0-9]{3}         再匹配0-9的数子匹配3位,
// -[0-9]{4}$       -在数据末尾执行匹配0-9的数据匹配4位

2.2:数字类型

JSON模式中有两种数字类型:integer和number。它们共享相同的验证关键字。

  • integer:同于整数,不适用于小数点。
  • number:用于任何数值类型,整数或浮点数字。
    两者均可用于包括大写的一到十。

支持参数

倍数:multipleOf
范围:x ≥ minimum x > exclusiveMinimum x ≤ maximumx < exclusiveMaximum

2.3:object对象

对象是JSON中的映射类型。它们将“键”映射到“值”。在JSON中,“键”必须总是字符串。每一对通常被称为“property”。
{ “type”: “object” } :一个键值对也可以成为一个对象

object支持可选参数

{"type": "object","properties": {},"patternProperties":{},"additionalProperties ":fasle或者true或者额外字段类型的定义,"required":[],"minProperties": 1,"maxProperties": 5
}
  • 1:properties
    properties 用于描述一个object对象的多个属性
{"type": "object","properties": {"number": { "type": "number" }}
}

{ “number”: 1600}

  • 2:patternProperties
    对符合正则匹配的字段套用该定义
{"type": "object","patternProperties": {"^S_": { "type": "string" },"^I_": { "type": "integer" }}
}

{ “S_25”: “This is a string” }

  • 3:additionalProperties 额外属性定义
{"type": "object","properties": {"number": { "type": "number" },"additionalProperties": { "type": "string" }   //允许存在未被定义的字段,类型必须是字符串}
}

“additionalProperties”: false//不允许存在未被定义的字段
{ “number”: 1600, “street_name”: “Pennsylvania”} //属性未被定义

  • 4:required必需
    必需存在的属性
 {"type": "object","properties": {"name": { "type": "string" },"email": { "type": "string" },"address": { "type": "string" },"telephone": { "type": "string" }},"required": ["name", "email"]
}

demo

{"name": "William Shakespeare","email": "bill@stratford-upon-avon.co.uk"
}
  • 4 propertyNames 对属性名称规则正则匹配
  • 5 size
    定义每个对象中属性个数
"minProperties": 1,
"maxProperties": 5

2.4:数组

数组包括list和元组tuple 。可以定义枚举值,唯一值,最大值,最小值,元素个数等参数。

  • 1:array
    数组中可以使用items关键字定义每个值的类型
{"type": "array","items": {   //定义每个元素类型"type": "number"},"uniqueItems": true   //是否允许值重复"minItems": 2,      //最小元素个数"maxItems": 3        //最大元素个数
}
  • 2:tuple元组
 "prefixItems": "items":"contains":{},"minContains": 2,"maxContains": 3"minItems": 2,"maxItems": 3

2.5:boolean

{ “type”: “boolean” } 允许的值为true或者false

2.6:架构组合

使用下面关键字进行组合不同定义的匹配,使得对于属性定义必须满足几个或者全部的要求,允许同时根据多个标准验证一个值一样简单。类似于AND、OR。

allOf  必须对所有子模式有效
anyOf 必须对任何子模式有效
oneOf 必须符合其中一个字schema
not 都不符合

所有这些关键字都必须设置为一个数组,其中每个项目都是一个模式

1:allOf 必须都符合

demo:类型必须是string并且要求最大长度

{"allOf": [{ "type": "string" },{ "maxLength": 5 }]
}

2:anyOf 任何一个符合

3:oneOf 其中一个符合

4:not 都不符合

可以通过additionalProperties=false或者true进行不同模式间的共享或者关闭

2.7:处理xml或txt等json数据

可以对于是xml或者text等不符合json的数据定义默认的类型,比如

{  //定义该字符串中是一个txt或者xml"type": "string","contentMediaType": "text/html"
}

2.8:条件属性绑定

对于某些字段间约束为一定的依赖关系,比如name属性必须依赖于age属性存在,其中一个不存在都不行。可以使用关键字

dependentRequired  同时存在或者同时不存在,可以定义双向依赖或者单向依赖
if/then/else
  • dependentRequired 定义了两个字段单向依赖
"dependentRequired": {"credit_card": ["billing_address"]}
  • if/then/else 对于子模式间的互相依赖判断,调用逻辑验证
    如果country值是“”然后。。。。。。
{"type": "object","properties": {"street_address": {"type": "string"},"country": {"default": "United States of America","enum": ["United States of America", "Canada"]}}, ### 上面是定义,下面可以进行判断条用不同的校验"if": {"properties": { "country": { "const": "United States of America" } }},"then": {"properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }},"else": {"properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }}
}

2.9:结构复杂组合示例

allof+ 依赖组成的复杂schema定义
如果满足country字段定义然后执行,否则执行,相当于is-else操作。

{"allOf": [{"if": {"properties": { "country": { "const": "United States of America" } }},"then": {"properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }}},{"if": {"properties": { "country": { "const": "Canada" } },"required": ["country"]},"then": {"properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }}},{"if": {"properties": { "country": { "const": "Netherlands" } },"required": ["country"]},"then": {"properties": { "postal_code": { "pattern": "[0-9]{4} [A-Z]{2}" } }}}]
}

2.10:type支持的通用参数

标题或者注释:title and description
字段默认值:"default":
枚举值:enum :[]     //属性含有多个值
固定值:const:某属性的值为固定的一个值,值相等才校验通过比如: "id": {"type": "string","const": "id"},

3:构造一个复杂的schema(ref和ref和ref和def)

可以定义不同的schema,在定义相同的部分直接进行互相引用,但是在schema中没有类似URL的定位符,但是有$ref和$def关键字进行资源位置标识。简单来说就是复用,和代码复用一样。

1:$ref关键字

使用$ref关键字引用#/definitions/Ref字段的定义。#代表这个schema,/代表跟路径。

{"properties": {"prop": {"$ref" : "#/definitions/Ref"}},"definitions" : {"Ref" : {"type" : "number"}}
}

4:JSON Schema开发实战

JSON Schema java实战
Java-JSON-工具/JSON-模式验证器
开发校验器推荐:
使用Jackson来处理Java代码中的JSON,使用:Java-JSON-工具/JSON-模式验证器
使用org.json API那么使用:JSON Schema everit-java实战

  • 推荐在线json和json-schema校验工具:https://www.jsonschemavalidator.net/
  • 推荐json转换为json-schema工具:https://tooltt.com/json2schema/

4.1:everit-org验证器

如果使用org.json解析处理json数据,则适合用everit-org检验器API。

  • 1:检验器:SchemaLoader类
    使用该类作为总入口,获取验证器
  • 2:对于验证的冲突如何解决,或者说如何处理异常:提供了ValidationException.getCausingExceptions()获取每一个校验失败原因。
    获取每一个异常并打印
try {schema.validate(rectangleMultipleFailures);  //检验
} catch (ValidationException e) {        //获取异常System.out.println(e.getMessage());    //输出异常e.getCausingExceptions().stream()    //打印每个异常.map(ValidationException::getMessage).forEach(System.out::println);
}
  • 3:json格式验证:为了清楚具体的json是否符合某种支持的类型,可以使用默认的校验器(ipv4等),也可以实现ValidationListener 接口验证数据。
    Validator validator = Validator.builder() .withListener(new YourValidationListenerImplementation()) .build(); validator.performValidation(schema, input);
  • 4:监听的严格程度:对于验证的失败数据是否继续验证可以进行设置

1:maven开发依赖

<dependency><groupId>com.github.everit-org.json-schema</groupId><artifactId>org.everit.json.schema</artifactId><version>1.14.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId><artifactId>json</artifactId><version>20201115</version></dependency><repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository>
</repositories>

若上面依赖导入失败可用下方依赖,两者选用一个即可

<dependency><groupId>com.networknt</groupId><artifactId>json-schema-validator</artifactId><version>1.0.63</version></dependency><dependency><groupId>org.everit.json</groupId><artifactId>org.everit.json.schema</artifactId><version>1.5.1</version></dependency

2:demo

json数据

{"name":"xiaoming","age":99,"like":"baskball","addr":{"city":"西安","county":"chain"}
}

schema规则

{"type": "object","required": [],"properties": {"name": {"type": "string"},"age": {"type": "number"},"like": {"type": "string"},"addr": {"type": "object","required": [],"properties": {"city": {"type": "string"},"county": {"type": "string"}}}}
}

代码测试

 public static void main(String[] args) {/*加载schema文件*/InputStream jsonSchemaTest = jsonSchema.class.getClassLoader().getResourceAsStream("jsonSchemaTest.json");JSONObject jsonObject = new JSONObject(new JSONTokener(jsonSchemaTest));//将JSON schema的JSON加载到模式验证器实例中。Schema load = SchemaLoader.load(jsonObject);/*加载json文件*/InputStream jsonStream = jsonSchema.class.getClassLoader().getResourceAsStream("jsonSchema1Data.json");
//验证try {load.validate(new JSONObject(new JSONTokener(jsonStream)));} catch (ValidationException e) {e.getCausingExceptions();System.out.println("校验成功");}}

4.2:json-schema-validator校验器

1:maven依赖

<dependency><groupId>com.github.java-json-tools</groupId><artifactId>json-schema-validator</artifactId><version>2.2.14</version>
</dependency>

json Schema 数据校验工具相关推荐

  1. JSON Schema数据校验入门

    快速开始 我们用一个例子来介绍说明 JSON Schema,虽然不可能面面俱到,但是对JSON Schema的基本概念.语法.使用有个较为全面的了解是完全没问题的. 这里假设我们有一个产品类目接口是用 ...

  2. Maatkit工具使用lt;一gt;之mysql主从数据校验工具

    mysql主从数据校验工具       mysql在5.1之前,其replication都是采用的STATEMENT模式,对表的数据是否一致要求并不严格,所以对数据一致性要求比较严格的应用,定期检查数 ...

  3. 如何快速写出Json Schema,校验Json Schema

    本文首发于微信公众号: [软测小生] 得到一个Json文件,如何快速的去测试呢? 难道是一个个节点的去验证吗?那显然效率太低了. 一般推荐使用Json Schema(一种Json的数据结构定义)去校验 ...

  4. json schema多种形式_如何快速写出Json Schema,校验Json Schema

    得到一个Json文件,如何快速的去测试呢? 难道是一个个节点的去验证吗?那显然效率太低了. 一般推荐使用Json Schema(一种Json的数据结构定义)去校验. 对于JsonSchema,有很多种 ...

  5. Webflux Controller请求Json的数据校验

    开一篇博客,纪念我逝去的两个小时. Spring对请求数据Json的校验,有两个方法.先说第一个坑@JsonProperty.requried() @JsonProperty.required 官方说 ...

  6. Go 语言编程 — validator 数据校验工具

    目录 文章目录 目录 Validator Quick start 约束类型 特殊约束 格式约束 数据结构类型约束 范围约束 字符串约束 唯一性约束 跨字段约束 自定义约束 错误处理 中文错误信息 参考 ...

  7. Vue基于JSON Schema生成表单和数据校验

    基于 Vue.js.JSON Schema 和 ElementUi 快速生成表单,支持自定义组件,支持自定义错误提示配置和校验规则... 源码:vue-json-schema-form github ...

  8. 好用的数据校验修复工具gt-checksum开源啦

    * GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 背景介绍 2. 功能特性 3. gt-checksum使用 3.1 标准使用案例 3.2 直接在命令行模式下使用 ...

  9. 3 分钟了解 JSON Schema

    大家好,我不是鱼皮. 幸运又不幸,我是一名程序员,他也是一名程序员. 周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在! 今天,他遇到了一个后 ...

最新文章

  1. (双引号)与 ' '(单引号)的区别
  2. 静态资源跨域解决方案
  3. eclipse java 1.8 vm_GGTS(Eclipse)和JAVA 1.8中不兼容的JVM
  4. cocos2d-x初探学习笔记(6)--场景间切换效果
  5. 重构机房收费系统总结1之配置文件+反射+抽象工厂
  6. centos yum安装nginx 提示 No package nginx available问题解决方法
  7. windows查看系统版本号
  8. 访问云服务器储存的mp4_访问云服务器储存的mp4
  9. Mysql Exists与in_在MySQL里,有个和in一样的东东叫做exists,但是它比in更牛叉,你会么?...
  10. c语言高精度算法阶乘_学了这么久的C语言,原来可以这样解决算法问题...
  11. 被神话的Linux, 一文带你看清Linux在多核可扩展性设计上的不足
  12. 一张图解释什么是遗传算法_什么是智慧水务决策支持系统?从一张图说起
  13. 网络编程技术-----windows网络编程
  14. 我的大学 --- 郭天祥【2】
  15. 网易云音乐等级快速升级:每天自动打卡听歌300首
  16. rpg学院 unity_Unity3d - RPG项目学习笔记(一)
  17. allegro更新铜皮方法和快捷键
  18. 乐客巴巴集团年会于2021年1月17日在广州举行
  19. WAV高清语音格式音频
  20. Excel-查找与引用函数

热门文章

  1. Kmalloc Vmalloc 与malloc 的区别
  2. 数据库新增幂等操作_数据库幂等性
  3. 超级电脑牛人大全[转] 搞笑。。。
  4. 海王小姐姐想分身,技术哥哥一分钟满足!
  5. jenkin自动部署VUE
  6. SAP HCM payroll schema
  7. Codeforces 1606B-Update Files
  8. c语言八进制转十进制
  9. 免费搜索引擎登录入口
  10. iOS开发——Quartz2D