一、介绍

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

五、遇到的问题

  1. 示例3在验证下述json时,使用V202012版本,anchor_element.search_scope的value不在枚举列表中未报异常,但V7版本可以。

  1. 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格式校验相关推荐

  1. JSON Schema校验数据

    参考 JSON Schema 规范(中文版)官方网站JSON Schema 对于数据对接系统来说,接口的数据入参校验尤为重要,使用javax.validation相关注解进行校验对于java对象的关联 ...

  2. JSON Schema数据校验入门

    快速开始 我们用一个例子来介绍说明 JSON Schema,虽然不可能面面俱到,但是对JSON Schema的基本概念.语法.使用有个较为全面的了解是完全没问题的. 这里假设我们有一个产品类目接口是用 ...

  3. Vue基于JSON Schema生成表单和数据校验

    基于 Vue.js.JSON Schema 和 ElementUi 快速生成表单,支持自定义组件,支持自定义错误提示配置和校验规则... 源码:vue-json-schema-form github ...

  4. json schema 关键字速查

    相关文章: [1] Understanding JSON Schema [2] Json Schema 快速入门 [3] Json Schema简介 1 引言 1.1 背景 json格式中提供如下A( ...

  5. JSON Schema的应用(具体的使用场景)

    什么是JSON Schema JSON Schema 是用于验证 JSON 数据结构的强大工具,Schema可以理解为模式或者规则. 要定义 JSON Schema 是什么,我们可能应该首先定义 JS ...

  6. 【Python】Json Schema的使用【原创】

    Json Schema在Python中的应用 一. 背景 二.概述 三.介绍 四.Python中使用 五.例子 六.参考 一. 背景 之前在做容器发布系统的时候,在部署时需要对提交的deploymen ...

  7. json schema多种形式_Json Schema简介

    1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...

  8. JSON Schema入门

    使用Json的好处(什么是Schema): 描述现有的数据格式 提供清晰的人工和机器可读文档 完整的数据结构,有利于自动化测试 完整的数据结构,有利于验证客户端提交数据的质量 什么是JSON Sche ...

  9. Json Schema快速入门

    Json Schema快速入门 JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范.它被写在 IETF 草案下并于 2011 年到期.JSON 模式: 描述现有数据格式. 干净的人 ...

最新文章

  1. (六) Docker 容器命令
  2. CodeForces - 1368D AND, OR and square sum(位运算+贪心)
  3. 用代理技术实现简单的AOP框架
  4. 软件的可扩展性与框架的可交互性
  5. 无法启动ServletWebServerApplicatio错误记录
  6. 从硬盘安装在XP下装红旗linux双系统
  7. Oracle 19.6 的有趣BUG:可能引发 CLOB 存储数据的丢失
  8. 跟我读论文丨ACL2021 NER 模块化交互网络用于命名实体识别
  9. mysql怎么添加约束成绩_mysql怎么添加约束?
  10. Git学习(2)Git 安装
  11. 三菱Q系列PLC程序,该设备由24个伺服电机、1套焊接机、2套CCD、4套扫码枪、6套位移传感器组成
  12. H5分享到微信朋友圈与好友实现思路
  13. java黄金分割点游戏_结对编程——Java实现黄金分割点游戏
  14. Toy例程导读(三).高级语言分析和转换
  15. 红外万能遥控器3.0,给家里带遥控器的家电赋能
  16. NexusJar包私服
  17. 康奈尔大学计算机硕士要求,康奈尔大学计算机硕士
  18. 打开任务管理器的方法
  19. 【网络】https单向认证和双向认证
  20. G1D45-与英文编辑沟通(cover letter、催稿一类)

热门文章

  1. ORACLE报错:PLS-00225:子程序或游标'XXX'引用超出范围
  2. 使用Nero软件刻录ISO系统盘
  3. 给Python漫画分集标题目录下载工具添加从列表文件下载功能
  4. Python入门习题(57)——团体程序设计天梯赛习题:古风排版
  5. 对txt文件中的文件内容进行断句
  6. vii php,VIIShop php网上商店系统
  7. python解决八数码问题_A*算法解决15数码问题_Python实现
  8. 从传统的图像压缩到基于深度学习的图像压缩
  9. [转载]WEB中实时时间的显示
  10. 高通平台 android 12 定时开关机