介绍
在json-schema官网上可以看到,java版本的validator库推荐了以下几种方案:
- Snow 2019-09, draft-07, -06 Uses Maven for the project and Gson under the hood. (GNU Affero General Public License v3.0)
- everit-org/json-schema draft-07, -06, -04 (Apache License 2.0)
- Justify draft-07, -06, -04 (Apache License 2.0)
- networknt/json-schema-validator draft-07, -06, -04 Support OpenAPI 3.0 with Jackson parser (Apache License 2.0)
常用的json-schema-validator库有:everit-org/json-schema和networknt/json-schema-validator ,在everit-org/json-schema的github介绍中可知,如果项目代码中使用jackson进行的json解析,推荐使用后者进行校验;如果使用的是org.json API 进行json解析,推荐使用前者校验。
google上搜索json-schema-validator,还可以搜另外一个库:fge/json-schema-validator,也是本文要介绍的。github地址:
- everit:GitHub - everit-org/json-schema: JSON Schema validator for java, based on the org.json API
- networknt: https://github.com/networknt/json-schema-validator
- fge:GitHub - java-json-tools/json-schema-validator: A JSON Schema validation implementation in pure Java, which aims for correctness and performance, in that order GitHub - fge/json-schema-validator-demo: Webapp demonstrating JSON Schema validation hosted on Heroku
注意:fge/json-schema-validator也称作 java-json-tools/json-schema-validator
在networknt github上有一个三者的性能对比,最快的是networknt。
- fge: 7130ms
- everit-org: 1168ms
- networknt: 223ms
fge特点:
- fge支持draft3,draft4;
- 使用jackson解析器;
fge提供了一个在线的json-schema-validator工具,地址:http://json-schema-validator.herokuapp.com/
示例
maven
<!-- fge -->
<dependency>
<groupId>com.github.fge</groupId>
<artifactId>json-schema-validator</artifactId>
<version>2.2.6</version>
</dependency>
<!-- fge 也可以使用下面的maven地址
<dependency>
<groupId>com.github.java-json-tools</groupId>
<artifactId>json-schema-validator</artifactId>
<version>2.2.14</version>
</dependency>
-->
<!-- fasterxml -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.0</version>
</dependency>
注:fge依赖jackson库。
示例1:
private static final ObjectMapper mapper = new ObjectMapper();
static final String json1 = "{\"a\":1}";
static final String json1_schema = "{\"$schema\":\"http://json-schema.org/draft-04/schema#\",\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"}}}";
public static void main(String[] args) {
try {
ProcessingReport report = JsonSchemaFactory.byDefault().getValidator()
.validateUnchecked(mapper.readTree(json1_schema),mapper.readTree(json1));
if (report.isSuccess()) {
System.out.println("valid success...");
} else {
List<JsonNode> errorsJsonArray = new ArrayList<>();
Iterator<ProcessingMessage> iterator = report.iterator();
while (iterator.hasNext()) {
errorsJsonArray.add(iterator.next().asJson());
}
System.out.println(errorsJsonArray.toString());
}
} catch (JsonProcessingException e) {//jackson的异常
e1.printStackTrace();
}
}
说明:
- validate和validateUnchecked两种校验方法:区别在于validateUnchecked方法不会抛出ProcessingException异常;
- ProcessingReport对象中维护了一共迭代器,如果执行失败(执行成功时没有信息),其提供了一些高级故障信息;
错误信息如下:
level: 错误级别(应该就是error)
schema:引起故障的模式的所在位置的 URI
instance:错误对象
domain:验证域
keyword:引起错误的约束key
found:现在类型
expected:期望类型
示例2:
校验时需要传递json和json-schema数据,只是需要构造成JsonNode对象,可以像上例中使用jackson的map来构造。其实fge提供了JsonLoader类,用来从文件、字符串中获取json和schema相关的JsonNode对象。例如:
//从文件中获取json和json-schema
static final String json_path = "";
static final String json_schema_path = "";
static void test2() {
try {
ProcessingReport report = JsonSchemaFactory.byDefault().getValidator()
.validateUnchecked(JsonLoader.fromReader(new FileReader(json_schema_path)),
JsonLoader.fromReader(new FileReader(json_path)));
if (report.isSuccess()) {
System.out.println("valid success...");
} else {
List<JsonNode> errorsJsonArray = new ArrayList<>();
Iterator<ProcessingMessage> iterator = report.iterator();
while (iterator.hasNext()) {
errorsJsonArray.add(iterator.next().asJson());
}
System.out.println(errorsJsonArray.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
//从字符串中获取json、json-schema
try {
ProcessingReport report = JsonSchemaFactory.byDefault().getValidator()
.validateUnchecked(JsonLoader.fromString(json1_schema),
JsonLoader.fromString(json1));
if (report.isSuccess()) {
System.out.println("valid success...");
} else {
List<JsonNode> errorsJsonArray = new ArrayList<>();
Iterator<ProcessingMessage> iterator = report.iterator();
while (iterator.hasNext()) {
errorsJsonArray.add(iterator.next().asJson());
}
System.out.println(errorsJsonArray.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
//从url中获取json、json-schema
static final String json_url = "";
static final String json_schema_url = "";
static void test4() {
try {
ProcessingReport report = JsonSchemaFactory.byDefault().getValidator()
.validateUnchecked(JsonLoader.fromURL(new URL(json_schema_url)),
JsonLoader.fromURL(new URL(json_url)));
if (report.isSuccess()) {
System.out.println("valid success...");
} else {
List<JsonNode> errorsJsonArray = new ArrayList<>();
Iterator<ProcessingMessage> iterator = report.iterator();
while (iterator.hasNext()) {
errorsJsonArray.add(iterator.next().asJson());
}
System.out.println(errorsJsonArray.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
参考:https://my.oschina.net/u/4400343/blog/3314469