JSON解析器之json schema校验及代码实现
2021-04-25 12:28
- string
maxLength: 校验string字符串的最大长度。超出长度校验失败。
minLength: 校验string字符串的最小长度。小于长度校验失败。
pattern: 字符串满足指定的正则表达式,才算通过校验。
format: 不常用,值只能是以下的取值date-time(时间格式)、email(邮件格式)、hostname(网站地址格式)、ipv4、ipv6、uri、uri-reference、uri-template、json-pointer。假如要校验的字符串是邮箱格式的可以使用"forma"t:"email",而不用pattern自己去指定正则表达式。
- object
properties: 每个key对应的值,都是一个json schema,则待校验JSON对象通过校验。从这里,我们可以看到,json schema的校验检测,这个对象才算是通过校验。
required: 值是个字符串数组,数组元素是本级的属性key。该关键字限制了JSON对象中必须包含哪些本级key。如果当然json不包含数组中的key则校验失败。
dependencies: 设置属性依赖,值是一个json schema。例如
"dependencies": {"credit_card":["billing_address"]},
表示有字段"credit_card"就必须有"billing_address"字段。但是这个依赖是单向的。有"billing_address"字段可以没有"credit_card"。
- array
items: 值是一个有效的JSON Schema或者一组有效的JSON Schema。只有待校验JSON数组中的所有元素均通过校验,整个数组才算通过校验。
例如:{"type": "array","items": { "type": "string", "minLength": 5 }} 这个数组只有满足长度大于5才会通过校验
uniqueItems: 值是一个布尔值,即boolean(true、false)。当该关键字的值为true时,只有待校验JSON数组中的所有元素都具有唯一性时,才能通过校验。
这里只是简单的列举了一些常用的关键字,如果想要学习更多的使用方法,可以去看下官方文档里面会有更详细的用例。
json schema中文使用教程文档
json schema draft-07版本官方文档
json schema官网
再分享两个链接
根据json数据生成schema约束
使用schema约束验证json数据
在程序中实现对json数据的校验
json schema官网中java语言对json schema的实现方式有三种
- 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)
本篇介绍的是第三种---第三方工具feg
导入依赖fge包,因为fge的方法要用到jsonNode,所以也就需要导入jackson的包
1 23 7 8com.github.fge 4 json-schema-validator 52.2.6 69 13com.fasterxml.jackson.core 10 jackson-core 112.3.0 1214 com.fasterxml.jackson.core 15 jackson-databind 162.3.0 17
将JSON数据转成jsonNode:
1 /** 2 * @param jsonStr 验证json字符串 3 */ 4 private static JsonNode strToJsonNode(String jsonStr) { 5 JsonNode jsonNode = null; 6 try { 7 jsonNode = JsonLoader.fromString(jsonStr); 8 } catch (IOException e) { 9 e.printStackTrace(); 10 } 11 return jsonNode; 12 }
获取本地的josn schema文件:
基于springboot项目,schema.json约束文件放在了resources/static/ 文件夹下
String jsonFilePath = "classpath:static/schema.json";
通过spring的工具类ResourceUtils.getFile(jsonFilePath)获取到文件的绝对路径
使用classpath:方法的好处就是不用在代码中写绝对路径。部署项目时不需要关心文件的位置。只要项目中的static文件中有schema.json文件就能获取到
1 /** 2 * @param jsonFilePath jsonSchema文件路径 3 */ 4 private static JsonNode schemaToJsonNode(String jsonFilePath) { 5 JsonNode jsonSchemaNode=null; 6 try { 7 jsonSchemaNode= new JsonNodeReader().fromReader(new FileReader(ResourceUtils.getFile(jsonFilePath))); 8 } catch (IOException e) { 9 e.printStackTrace(); 10 } 11 return jsonSchemaNode; 12 }
schema校验代码实例:
1 /** 2 * @param jsonNode json数据node 3 * @param schemaNode jsonSchema约束node 4 */ 5 private static boolean getProcessingReport(JsonNode jsonNode, JsonNode schemaNode) { 6 //fge验证json数据是否符合json schema约束规则 7 ProcessingReport report = JsonSchemaFactory.byDefault().getValidator().validateUnchecked(schemaNode, jsonNode); 8 if (report.isSuccess()) { 9 // 校验成功 10 return true; 11 } else { 12 Iteratorit = report.iterator(); 13 StringBuilder ms = new StringBuilder(); 14 ms.append("json格式错误: "); 15 while (it.hasNext()) { 16 ProcessingMessage pm = it.next(); 17 if (!LogLevel.WARNING.equals(pm.getLogLevel())) { 18 ms.append(pm); 19 } 20 } 21 System.err.println(ms); 22 return false; 23 } 24 }
写在最后
本篇文章只为了记录和分享自己学习的成果,能够帮助更多的小伙伴当然是更好了,如果有错误欢迎指出。谢谢!
上一篇:JS——表格高亮显示
下一篇:HTTP协议
文章标题:JSON解析器之json schema校验及代码实现
文章链接:http://soscw.com/index.php/essay/79391.html