JSON Schema 校验实例
JSON Schema 简介
JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.
JSON Schema 是一个可以对json格式数据进行校验和进行内容描述的文档,它本身也是基于json格式的。
主要有以下作用:
- 对现有的json数据格式进行描述(字段类型、内容长度、是否必须存在、取值示例等);
- 是一个描述清晰、人机可读的文档;
- 自动测试、验证客户端提交的数据;
JSON Schema 简单示例
我们把需要被验证的json文档称为instance,用来校验它的文档就是schema;
一个最基础的schema就是一个空的json对象 {} ,对instance不做任何限制,没有任何描述。下面是一个简单的instance和schema示例:
需要被校验的instance:
{
"foo": 32,
"bar": "Must equal this value"
}
schema:
{
"type": "object",
"properties": {
"foo": {
"type": "number"
},
"bar": {
"const": "Must equal this value"
}
}
}
其中关键字“type”可以用来对instance的类型进行限制,它可以取如下几个值 object, array, string, number, boolean, null。
关键字“const”要求被验证的数据与其所定义的内容保持一致。
JSON Schema 在线工具
根据JSON数据和对应的JSON Schema校验数据:
http://json-schema-validator.herokuapp.com/
https://jsonschemalint.com/
根据JSON数据在线生成JSON Schema:
https://jsonschema.net/
JSON Schema第三方工具
JSON Schema已经有多种语言实现的第三方工具可以使用,详见官网说明:http://json-schema.org/implementations。下面3个是java的相关实现:
json-schema-validator supports draft 4 includes draft-04 hype-schema syntax support (LGPLv3)
json-schema (implementation based on the org.json API) supports draft 4, draft 6 (Apache License 2.0)
json-schema-validator supports draft 4 (Apache License 2.0)
使用第三方工具json-schema-validator
下面使用上述3个工具中的第一个,实现用schema验证json数据的功能:
1.首先在pom里,添加如下配置:
<!-- fge -->
<dependency>
<groupId>com.github.fge</groupId>
<artifactId>json-schema-validator</artifactId>
<version>2.2.6</version>
</dependency>
<!-- fasterxml -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
2.编写工具类JsonSchemaValidator.java
public class JsonSchemaValidator {
public static Map<String, Object> validateJsonByFgeByJsonNode(JsonNode jsonNode, JsonNode schemaNode) {
Map<String, Object> result = new HashMap<String, Object>();
ProcessingReport report = null;
report = JsonSchemaFactory.byDefault().getValidator().validateUnchecked(schemaNode, jsonNode);
if (report.isSuccess()) {
// 校验成功
result.put("message", "校验成功!");
result.put("success", true);
return result;
} else {
System.out.println("校验失败!");
Iterator<ProcessingMessage> it = report.iterator();
String ms = "";
while (it.hasNext()) {
ProcessingMessage pm = it.next();
if (!LogLevel.WARNING.equals(pm.getLogLevel())) {
ms += pm;
}
}
result.put("message", "校验失败!" + ms);
result.put("success", false);
return result;
}
}
public static JsonNode getJsonNodeFromString(String jsonStr) {
JsonNode jsonNode = null;
try {
jsonNode = JsonLoader.fromString(jsonStr);
} catch (IOException e) {
e.printStackTrace();
}
return jsonNode;
}
public static JsonNode getJsonNodeFromFile(String filePath) {
JsonNode jsonNode = null;
try {
jsonNode = new JsonNodeReader().fromReader(new FileReader(filePath));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return jsonNode;
}
}
3.接收页面数据、读取文件数据的JsonSchemaController
@RestController
public class JsonSchemaController {
@Value("${upload.rootPath}")
private String rootPath;
@RequestMapping(value = "/json-schema/validate", method = RequestMethod.GET)
public Map<String, Object> jsonSchemaValidate(String jsonStr) {
Map<String, Object> result = new HashMap<String, Object>();
JsonNode jsonNode = JsonSchemaValidator.getJsonNodeFromString(jsonStr);
if (jsonNode == null) {
result.put("success", false);
result.put("message", "json报文格式错误");
return result;
}
String filePath = rootPath + "/json-file/json_schema_test.json";
JsonNode schemaNode = JsonSchemaValidator.getJsonNodeFromFile(filePath);
if (schemaNode == null) {
result.put("success", false);
result.put("message", "json Schema文件不存在,无法校验!");
return result;
}
return JsonSchemaValidator.validateJsonByFgeByJsonNode(jsonNode, schemaNode);
}
}
3.前端页面json_schema.html
<body class=" ">
<div>
<textarea class=" " name="parameterContentLeft" id="parameterContentLeft" placeholder="请输入请求报文内容"></textarea>
</div>
<br>
<button onclick="setAjaxRequest();" id="doJson" class=" ">发送</button>
<div class=" ">
<pre id="responsePre">
</pre>
</div>
<script src="frame/jquery.min.js"></script>
<script>
function setAjaxRequest() {
$.ajax({
url : "/json-schema/validate",
type : "GET",
data : {
jsonStr : $("#parameterContentLeft").val()
},
async : false
}).done(function(data) {
$("#responsePre").html(data.message);
});
}
</script>
</body>
测试功能
下面使用上面提到的在线生成scheme的工具里提供的样例,测试下我们刚才编写的代码:
instance:
{
"checked": false,
"dimensions": {
"width": 5,
"height": 10
},
"id": 1,
"name": "A green door",
"price": 12.5,
"tags": [
"home",
"green"
]
schema过长,就不贴了,详见这里
在页面进行测试,效果如下:

把 "width": 5 改为 "width": 5.5,测试效果:

在2个在线测试工具上测试效果:


可以看到2个在线测试工具,一个输出了错误信息和警告信息,另一个只输出了错误信息。而我们本地开发的工具只输出了错误信息,是我把警告过滤掉了,这个可以根据实际需求进行修改;
JSON Schema 校验实例的更多相关文章
- json schema校验
工作中使用到了json schema格式校验的问题,在网上查了些资料,结合自己的理解记录一下. json schema可以对json结果字符串做出一些约束,例如: 1. 值类型是:array, obj ...
- 利用JSON Schema校验JSON数据格式
最近笔者在工作中需要监控一批http接口,并对返回的JSON数据进行校验.正好之前在某前端大神的分享中得知这个神器的存在,调研一番之后应用在该项目中,并取得了不错的效果,特地在此分享给各位读者. 什么 ...
- Json schema 以及在python中的jsonschema
目录 1. JSON Schema简介 2. JSON Schema关键字详解 2.1 $schema 2.2 title和description 2.3 type 3 type常见取值 3.1 当t ...
- Json.Net使用JSON Schema验证JSON格式【实例】
给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...
- Understanding JSON Schema
json schema 在线校验器 译自:Understanding JSON Schema { "type": "object", "propert ...
- Json Schema的使用
直接上案例: 在Web Api通讯中,客户端发送json数据,服务端反序列化json(json与某个类形成对应关系),在某些情况下,需要校验其上传的json是否合法. 服务端是使用Json.net(n ...
- Json Schema简介
1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...
- rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)
rest-assured从2.1.0版本开始支持 Schema 验证,包括JSON Schema validation及Xml Schema validation.我们之前断言响应体都是一个一个字段 ...
- 怎样用Google APIs和Google的应用系统进行集成(5)----怎样把Google Tasks的JSON Schema转换成XML的Schema(XSD)?
前面说了一些Google API的介绍,可是在实际的开发其中,我们可能须要把Google RESTful API返回的JSON数据转换成XML数据输入到第三方系统,这在企业应用集成里面很的常见. 那么 ...
随机推荐
- python进阶------进程线程(一)
Python中的进程线程 一.进程线程的概念 1.1进程: 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及 ...
- [Python]循环嵌套nested loop-练习题
[python的for循环嵌套打印如下图形] 图形一: ******* ******* ******* ******* 图形二: * *** ***** ******* 图形三: * *** **** ...
- Python 面向对象(五) 描述器
使用到了__get__,__set__,__delete__中的任何一种方法的类就是描述器 描述器的定义 一个类实现了__get__,__set__,__delete__中任意一个,这个类就是描述器. ...
- python3学习笔记(1)
一.模块初识(接上篇)模块(库)分为两种:1.标准库:不需要安装直接可以导入的库,例:getpass.2.第三方库:必须要下载安装才可以使用.注:编辑的模块文件名不能与导入的模块名重复. 在模块文件中 ...
- 关于IDEA无法引入包和类的情况
原因:修改一些包结构后,会出现无法将类引入的情况. 通过清理缓存解决:
- .net 系列:并发编程之一 并发编程的初步理论
一.关于并发编程的几个误解 1)并发就是多线程 实际上多线程只是并发编程的一种形式而已,在C#中还有很多其他的并发编程技术,包括异步编程,并行编程,TPL数据流,响应式编程等. 2)只有大型服务器才 ...
- C#常见错误解决方法
1.能提供Visual Studio开发工具包吗? 解决方法: Visual Studio 2017开发环境下载地址: https://www.visualstudio.com/zh-hans/dow ...
- 2018届研究生招生预推免(THU,HIT)经历分享——guochengtao
注:本文为作者原创文章,且为无偿分享,读者可以阅读,但请尊重劳动成果,勿作为商业用途!如对文章中的内容有意见或者出现了您不喜欢的言论,请您保留,谢谢合作! 又到一年12月,这代表着2017年已经接近尾 ...
- Python3使用PyQt5制作简单的画板/手写板
0.目录 1.前言 2.简单的画板1.0 在定点和移动中的鼠标所在处画一条线 3.简单的画板2.0 在定点和移动中的鼠标所在处画一条线 并将画过的线都保留在窗体上 4.简单的画板3.0 将按住鼠标后移 ...
- 【hdu3367】Pseudoforest(伪森林)
http://acm.hdu.edu.cn/showproblem.php?pid=3367 题目大意 伪森林就是一个无向图,这个无向图有多个连通块且每个连通块只有一个简单环. 给你一个无向图,让你找 ...