0
点赞
收藏
分享

微信扫一扫

JSON Schema 校验库——json-schema-validator(java版本)

介绍

在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:​​https://github.com/everit-org/json-schema​​
  • networknt:​​https://github.com/networknt/json-schema-validator​​
  • fge:​​https://github.com/java-json-tools/json-schema-validator​​​​https://github.com/fge/json-schema-validator-demo​​

注意: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();
}
}

 


举报

相关推荐

0 条评论