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-schemanetworknt/json-schema-validator ,在everit-org/json-schema的github介绍中可知,如果项目代码中使用jackson进行的json解析,推荐使用后者进行校验;如果使用的是org.json API 进行json解析,推荐使用前者校验。

google上搜索json-schema-validator,还可以搜另外一个库:fge/json-schema-validator,也是本文要介绍的。github地址:

注意: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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值