网站首页 > java教程 正文
一、目的
在Web Service对外交互方式的演变中,RESTful API已经成为主流的设计风格,JSON的轻量且简洁优点,使得JSON成为RESTful API主要的数据交换格式。RESTful请求过程是,客户端发送RESTful请求到Web Service节点,请求header中设置Content-Type=application/json,请求body中是JSON数据,Web Service根据Content-Type校验JSON数据。JSON数据校验有两种策略:一种是在进行实际业务处理前校验,该方式将数据校验和业务处理耦合在一起,可能存在前面数据校验和业务处理成功,后面数据校验失败,导致前面业务回退,效率低下;另一种是将数据校验和业务处理分开,提前设定JSON数据的Schema,所有业务处理前,JSON数据进行Schema校验,该方式简洁且效率高,已经成为主流方式。
本文介绍JSON Schema语法、样例、以及Python和Java中Validation方法,为大家提供参考。
二、语法
2.1 Json Schema Keywords
序号 | keyword | 是否必须 | 说明 |
1 | $schema | 否 | 当前文档是否为标准JSON Schema文档,例如: "$schema": "http://json-schema.org/draft-04/schema#" |
2 | $ref | 否 | 引用其他的JSON Schema |
3 | id | 否 | id |
4 | title | 否 | 标题 |
5 | description | 否 | 描述 |
6 | type | 是 | 类型,例如:object、array、string、number、integer、boolean、null、any |
7 | properties | - | type=object时,properties必须存在 |
8 | patternProperties | 否 | 正则属性,例如: "patternProperties": { "^test_": { "type": "string" }, } test开头且类型为string的属性 |
9 | additionalProperties | 否 | false - JSON串中只能出现Schema中定义的属性 true - JSON串中可以出现不在Schema中定义的属性 "additionalProperties": { "type": "string" } - JSON串中可以出现不在Schema中定义的属性,但类型必须string |
10 | required | 否 | 必须出现的properties |
11 | dependencies | 否 | |
12 | size | 否 | |
13 | minimum | 否 | type=number,最小值 |
14 | exclusiveMinimum | 否 | type=number,最小值,不包含minimum |
15 | maximum | 否 | type=number,最大值 |
16 | exclusiveMaximum | 否 | type=number,最大值,不包含maximum |
17 | multipleOf | 否 | |
18 | anyOf | 否 | 满足任意一个即可,例如: { "anyOf": [ { "type": "string"}, { "type": "number"} ] } |
19 | allOf | 否 | 满足所有,例如: { "allOf": [ { "type": "string" }, { "maxLength": 5 } ] } |
20 | oneOf | 否 | 满足唯一一个,例如: { "type": "string", "oneOf": [ { "format": "host-name" }, { "format": "ipv4" }, { "format": "ipv6" } ] } |
21 | not | 否 | 例如: { "not": { "type": "string" } } |
22 | items | - | type=array时,items必须存在 |
23 | enum | 否 | 枚举类型,例如: { "type": "string", "enum": ["test1", "test2", "test3"] } 属性类型为string,且只能是test1、test2、test3其中一个。 |
24 | minItems | 否 | type=array,最小条目个数 |
25 | maxItems | 否 | type=array,最大条目个数 |
26 | uniqueItems | 否 | type=array,true - 条目不重复,反之可重复 |
27 | minLength | 否 | type=string,最小字符个数 |
28 | maxLength | 否 | type=string,最大字符个数 |
29 | format | 否 | format规则,优先级大于type,包括:date-time、date、time、utc-millisec、regex、color、style、phone、uri、email、ip-address、ipv6、host-name、uuid、anything else(type unchanged) |
30 | divisibleBy | 否 | |
31 | disallow | 否 | 不包含,例如: { "type": "object", "properties": { "id": { "disallow": "any" }, "name": { "type": "string", "required": true } } } |
32 | extends | 否 | 继承,例如: { "type" : "object", "extends" : { "$ref" : "xxx.json" } } |
33 | default | 否 | 默认值 |
34 | definitions | 否 | 复用Json Schema,例如: { "$ref": "#/definitions/xxx" } { "$ref": "definitions.json#/xxx" } |
35 | pattern | 否 | 正则值,例如: { "type": "string", "pattern": "^test" } test开头的值 |
2.2 Json Schema Example
Json Schema |
{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "Test", "type": "array", "items": { "type": "object", "properties": { "prop1": { "description": "prop1", "type": "integer" }, "prop2": { "description": "prop2", "type": "string", "enum": ["test1", "test2", "test3"] }, "prop3": { "type": "number", "minimum": 60, "exclusiveMinimum": true, "maximum": 100, "exclusiveMaximum": true } }, "required": ["prop1", "prop2", "prop3"] }, minItems: 1, maxItems: 5, uniqueItems: true } |
Json Instance |
[{ 'prop1': 1, 'prop2': 'test1', 'prop3': 91 }, { 'prop1': 2, 'prop2': 'test2', 'prop3': 92 } ] |
三、应用
3.1 Python Json Schema Validation
# JSON_SCHEMA:json schema string
# JSON_INSTANCE: json instance string
from jsonschema.validators import Draft4Validator
validator = Draft4Validator(schema=JSON_SCHEMA)
validator.validate(JSON_INSTANCE)
3.2 Java Json Schema Validation
import com.fasterxml.jackson.databind.JsonNode;
import com.github.fge.jackson.JsonLoader;
import com.github.fge.jsonschema.core.exceptions.ProcessingException;
import com.github.fge.jsonschema.core.report.ProcessingReport;
import com.github.fge.jsonschema.main.JsonSchema;
import com.github.fge.jsonschema.main.JsonSchemaFactory;
JsonNode schemaNode = JsonLoader.fromString(JSON_SCHEMA);
JsonNode instanceNode = JsonLoader.fromString(JSON_INSTANCE);
JsonSchema jsonSchema = factory.getJsonSchema(schemaNode);
ProcessingReport report = jsonSchema.validate(instanceNode);
四、参考
[1] The JSON Schema web site:
http://www.json-schema.org
[2] The JSON Schema github:
https://github.com/json-schema-org
[3] JSON instance to JSON schema:
https://jsonschema.net/#/
[4] JSON Schema instance validation:
https://www.jsonschemavalidator.net/
猜你喜欢
- 2024-10-28 JavaScript获取json中key所对应的value值的简单方法
- 2024-10-28 为什么JSON.parse会损坏大数字,如何解决这个问题?
- 2024-10-28 这几个JSON 工具,你是不是错过了
- 2024-10-28 深入解析 JSONPath:从入门到精通(jsonpath解析json)
- 2024-10-28 《Servlet》第18节:HttpServletResponse响应JSON和HTML内容
- 2024-10-28 netty系列之:netty中的核心解码器json
- 2024-10-28 Android JSON(android json to room)
- 2024-10-28 一种适合懒人的JSON解析方式(json解析工具哪个好用)
- 2024-10-28 JAVA实现生成多层JSON格式数据(含源码——三层样例)
- 2024-10-28 一个SQLServer中JSON文档型数据的查询问题
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)