JSON Schema定义 +Networknt validator格式校验
一、介绍
JSON Schema是基于JSON的格式的规范,用于定义JSON数据的结构。
官网:https://ajv.js.org/json-schema.html
在线验证:https://www.jsonschemavalidator.net/
在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解析,推荐使用前者校验。
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:https://github.com/java-json-tools/json-schema-validator
注意:fge/json-schema-validator也称作 java-json-tools/json-schema-validator
参考:https://blog.csdn.net/liuxiao723846/article/details/108578544
二、性能对比
在networknt github上有一个三者的性能对比,最快的是networknt。
fge: 7130ms
everit-org: 1168ms
networknt: 223ms
三、json Schema示例
示例1
{"type":"object","required":["client_side_conn_param","server_side_conn_param","bypass_duplicated_packet"],"properties":{"client_side_conn_param":{"$ref":"#/$defs/conn_params"},"server_side_conn_param":{"$ref":"#/$defs/conn_params"},"bypass_duplicated_packet":{"type":"integer","enum":[0,1]}},"$defs":{"conn_params":{"type":"object","required":["tcp_maxseg","nodelay","keep_alive","ttl","user_timeout"],"properties":{"tcp_maxseg":{"type":"object","properties":{"enable":{"type":"integer","enum":[0,1]},"maxseg":{"type":"integer"}},"if":{"properties":{"enable":{"const":1}}},"then":{"properties":{"maxseg":{"minimum":536,"maximum":1460}},"required":["maxseg"]}},"nodelay":{"type":"integer","enum":[0,1]},"keep_alive":{"type":"object","required":["enable"],"properties":{"enable":{"type":"integer","enum":[0,1]},"tcp_keepcnt":{"type":"integer"},"tcp_keepidle":{"type":"integer"},"tcp_keepintvl":{"type":"integer"}},"if":{"properties":{"enable":{"const":1}}},"then":{"properties":{"tcp_keepcnt":{"minimum":1,"maximum":222},"tcp_keepidle":{"minimum":30,"maximum":7200},"tcp_keepintvl":{"minimum":15,"maximum":75}},"required":["tcp_keepcnt","tcp_keepidle","tcp_keepintvl"]}},"ttl":{"type":"integer","minimum":1,"maximum":255},"user_timeout":{"type":"integer","minimum":200,"maximum":60000}}}}
}
示例2:array、maxItems、maxLength
{"type":"object","required":["method","rules"],"properties":{"method":{"type":"string","enum":["replace"]},"rules":{"type":"array","maxItems":16,"items":{"required":["search_in","find","replace_with"],"properties":{"regex_enable":{"type":"integer","enum":[0,1]},"search_in":{"type":"string"},"find":{"type":"string","minLength":1},"replace_with":{"type":"string","minLength":1}}}}}
}
示例3
{"type":"object","required":["method","rules"],"properties":{"method":{"type":"string","enum":["edit_element"]},"rules":{"type":"array","items":{"required":["anchor_element","target_element"],"properties":{"anchor_element":{"type":"object","required":["search_scope","contained_keyword"],"properties":{"search_scope":{"type":"string","enum":["whole_file","inside_element"]},"start_indicator":{"type":"string"},"contained_keyword":{"type":"string"}},"if":{"properties":{"search_scope":{"const":"inside_element"}}},"then":{"required":["start_indicator"]}},"target_element":{"type":"object","required":["target_distance_from_matching","element_treatment"],"properties":{"target_distance_from_matching":{"type":"integer"},"element_treatment":{"type":"string","enum":["mark","remove"]}}}}}}}
}
四、networknt验证
<dependency><groupId>com.networknt</groupId><artifactId>json-schema-validator</artifactId><version>1.0.76</version>
</dependency>
@Test
public void testNetworknt() {try {//可指定版本JsonSchemaFactory schemaFactory = JsonSchemaFactory.builder(com.networknt.schema.JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7)).objectMapper(new ObjectMapper()).build();JsonSchema schema = schemaFactory.getSchema(JsonMapper.fromJsonString(replaceSchema, JsonNode.class));Set<ValidationMessage> validate = schema.validate(JsonMapper.fromJsonString(repData, JsonNode.class));Iterator<ValidationMessage> iterator = validate.iterator();while (iterator.hasNext()){ValidationMessage next = iterator.next();System.out.println(next.getMessage());}}catch(Exception e ){e.printStackTrace();}
}
五、遇到的问题
示例3在验证下述json时,使用V202012版本,anchor_element.search_scope的value不在枚举列表中未报异常,但V7版本可以。
Networknt要求使用的jaskson的版本在2.12.1以上,否则部分Json Schema属性无法使用,如maxItems、minLength。详见:https://github.com/networknt/json-schema-validator/issues/469
异常信息:
14:43:19.498 [main] DEBUG com.networknt.schema.PropertiesValidator - validate( {"name":"o"}, {"name":"o"}, $)
14:43:19.499 [main] WARN com.networknt.schema.JsonMetaSchema - Could not load validator minLength
com.networknt.schema.JsonSchemaException: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.JsonNode.canConvertToExactIntegral()Zat com.networknt.schema.JsonMetaSchema.newValidator(JsonMetaSchema.java:293)at com.networknt.schema.ValidationContext.newValidator(ValidationContext.java:57)at com.networknt.schema.JsonSchema.read(JsonSchema.java:236)at com.networknt.schema.JsonSchema.getValidators(JsonSchema.java:524)at com.networknt.schema.JsonSchema.validate(JsonSchema.java:315)at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:69)at com.networknt.schema.JsonSchema.validate(JsonSchema.java:316)at com.networknt.schema.JsonSchema.validate(JsonSchema.java:299)at cn.nis.ntc.JsonValidate.testNetworknt(JsonValidate.java:92)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.JsonNode.canConvertToExactIntegral()Z
JSON Schema定义 +Networknt validator格式校验相关推荐
- JSON Schema校验数据
参考 JSON Schema 规范(中文版)官方网站JSON Schema 对于数据对接系统来说,接口的数据入参校验尤为重要,使用javax.validation相关注解进行校验对于java对象的关联 ...
- JSON Schema数据校验入门
快速开始 我们用一个例子来介绍说明 JSON Schema,虽然不可能面面俱到,但是对JSON Schema的基本概念.语法.使用有个较为全面的了解是完全没问题的. 这里假设我们有一个产品类目接口是用 ...
- Vue基于JSON Schema生成表单和数据校验
基于 Vue.js.JSON Schema 和 ElementUi 快速生成表单,支持自定义组件,支持自定义错误提示配置和校验规则... 源码:vue-json-schema-form github ...
- json schema 关键字速查
相关文章: [1] Understanding JSON Schema [2] Json Schema 快速入门 [3] Json Schema简介 1 引言 1.1 背景 json格式中提供如下A( ...
- JSON Schema的应用(具体的使用场景)
什么是JSON Schema JSON Schema 是用于验证 JSON 数据结构的强大工具,Schema可以理解为模式或者规则. 要定义 JSON Schema 是什么,我们可能应该首先定义 JS ...
- 【Python】Json Schema的使用【原创】
Json Schema在Python中的应用 一. 背景 二.概述 三.介绍 四.Python中使用 五.例子 六.参考 一. 背景 之前在做容器发布系统的时候,在部署时需要对提交的deploymen ...
- json schema多种形式_Json Schema简介
1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...
- JSON Schema入门
使用Json的好处(什么是Schema): 描述现有的数据格式 提供清晰的人工和机器可读文档 完整的数据结构,有利于自动化测试 完整的数据结构,有利于验证客户端提交数据的质量 什么是JSON Sche ...
- Json Schema快速入门
Json Schema快速入门 JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范.它被写在 IETF 草案下并于 2011 年到期.JSON 模式: 描述现有数据格式. 干净的人 ...
最新文章
- (六) Docker 容器命令
- CodeForces - 1368D AND, OR and square sum(位运算+贪心)
- 用代理技术实现简单的AOP框架
- 软件的可扩展性与框架的可交互性
- 无法启动ServletWebServerApplicatio错误记录
- 从硬盘安装在XP下装红旗linux双系统
- Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失
- 跟我读论文丨ACL2021 NER 模块化交互网络用于命名实体识别
- mysql怎么添加约束成绩_mysql怎么添加约束?
- Git学习(2)Git 安装
- 三菱Q系列PLC程序,该设备由24个伺服电机、1套焊接机、2套CCD、4套扫码枪、6套位移传感器组成
- H5分享到微信朋友圈与好友实现思路
- java黄金分割点游戏_结对编程——Java实现黄金分割点游戏
- Toy例程导读(三).高级语言分析和转换
- 红外万能遥控器3.0,给家里带遥控器的家电赋能
- NexusJar包私服
- 康奈尔大学计算机硕士要求,康奈尔大学计算机硕士
- 打开任务管理器的方法
- 【网络】https单向认证和双向认证
- G1D45-与英文编辑沟通(cover letter、催稿一类)