java校验json的格式是否符合要求的操作方法
2023-04-24 06:03:56 来源:脚本之家
目录
JSON Schemajson-schema-validator1. 引入依赖2. 编写schema3. 代码实现4. 执行结果5. 整理总结参考文档在日常开发过程中,会有这样的需求,校验某个json是否是我们想要的数据格式,如果每个层级去判断,基本不太可能实现,当然java有开源的工具,我们可以直接使用
JSON Schema
JSON Schema 是用于验证 JSON 数据结构的强大工具,Schema可以理解为模式或者规则。
Json Schema定义了一套词汇和规则,这套词汇和规则用来定义Json元数据,且元数据也是通过Json数据形式表达的。Json元数据定义了Json数据需要满足的规范,规范包括成员、结构、类型、约束等。
【资料图】
JSON Schema 就是json的格式描述、定义、模板,有了他就可以生成任何符合要求的json数据
json-schema-validator
在java中,对json数据格式的校验,使用 json-schema-validator
,具体实例如下:
1. 引入依赖
com.github.fge json-schema-validator 2.2.6 com.fasterxml.jackson.core jackson-core 2.3.0 com.fasterxml.jackson.core jackson-core 2.3.0
jackson-core
和 jackson-core
是必须要引入的,他们为 json-schema-validator
必须的
2. 编写schema
如果我们要校验的数据格式如下:
{ "data": [ { "sex": "男", "name": "王小明", "age": 18 }, { "sex": "女", "name": "王小红", "age": 17 } ], "type": "human" }
外面是type和data,里面是一个数组,数组属性包括sex、name、age
编写schema文件
{ "type": "object", "properties": { "type": { "type": "string" }, "data": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 3 }, "sex": { "enum": [ "男", "女" ] }, "age": { "type": "number" } }, "required": [ "name", "sex", "age" ] } } }, "required": [ "type", "data" ] }
以上json描述了目标json的数据格式,外层必须字段type、data,里面限制了name的最大长度 maxLength
为3,sex 为枚举值,只可取 男、女两个字符串,age 为number类型。
3. 代码实现
public Map validatorJsonUnchecked(String body) { Mapmap = new HashMap<>(); String filePath = "validator" + File.separator + "validator.json"; ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonNodeSchema = objectMapper.readTree(ResourceUtil.readUtf8Str(filePath)); JsonNode jsonNode = objectMapper.readTree(body); ProcessingReport processingReport = JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true); if (!processingReport.isSuccess()) { processingReport.forEach(processingMessage -> { JsonNode missing = processingMessage.asJson().get("missing"); String keyword = processingMessage.asJson().get("keyword").asText(); // 如果缺失字段 if (!Objects.isNull(missing)) { missing.forEach(miss -> { String text = miss.asText(); map.put(text, text + " 字段缺失"); }); // 如果字段超长 } else if ("maxLength".equals(keyword)) { String field = processingMessage.asJson().get("instance").get("pointer").asText(); String value = processingMessage.asJson().get("value").asText(); field = field.substring(field.lastIndexOf("/") + 1); map.put(field, value + " 字段长度过长"); // 如果不在枚举范围内 } else if ("enum".equals(keyword)) { String field = processingMessage.asJson().get("instance").get("pointer").asText(); String value = processingMessage.asJson().get("value").asText(); field = field.substring(field.lastIndexOf("/") + 1); map.put(field, field + "字段值错误," + value + "不在枚举范围内"); } else if ("type".equals(keyword)) { String field = processingMessage.asJson().get("instance").get("pointer").asText(); String found = processingMessage.asJson().get("found").asText(); String expected = processingMessage.asJson().get("expected").toString(); field = field.substring(field.lastIndexOf("/") + 1); map.put(field, field + " 类型错误,现有类型: " + found + ", 预期类型:" + expected); } }); } } catch (IOException | ProcessingException e) { log.error("校验json格式异常", e); } return map; }
以上代码首先获取了 要校验的json的标准文件 validator.json
,然后调用 JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true)
方法对传进来的json 进行了校验,这里 true
的意思是深度检查,如果没有这个参数,校验json的时候遇到第一个错误,就直接返回了
接下来构建测试方法
public static void main(String[] args) { ValidatorService validatorService = new ValidatorServiceImpl(); Mapbody = new HashMap<>(); HashMap one = new HashMap () {{ put("name", "王小明"); put("sex", "男"); put("age", 18); }}; HashMap two = new HashMap () {{ put("name", "王小明1"); put("sex", "未知"); put("age", "18"); }}; body.put("type", "human"); body.put("data", Arrays.asList(one,two)); Map map = validatorService.validatorJsonUnchecked(JSONUtil.toJsonStr(body)); System.out.println(map); }
4. 执行结果
{sex=sex字段值错误,未知不在枚举范围内, name=王小明1 字段长度过长, age=age 类型错误,现有类型: string, 预期类型:["integer","number"]}
5. 整理总结
如果schema 编写的时候,对列表使用了中括号 []
,那么当校验的时候只会校验数组中的第一个,这是一个坑,如下
{ "type": "object", "properties": { "type": { "type": "string" }, "data": { "type": "array", "items": [ { "type": "object", "properties": { "name": { "type": "string", "maxLength": 3 }, "sex": { "enum": [ "男", "女" ] }, "age": { "type": "number" } }, "required": [ "name", "sex", "age" ] } ] } }, "required": [ "type", "data" ] }
如果是这样的话,只会校验 data 数组的第一条数据,其他的有错误也不会报错!!
JSON Schema 功能很强大,支持表达式,支持是否允许额外属性,支持逻辑组合等,如果想了解更新json校验的知识,请参考下面参考文档
参考文档
www.cnblogs.com/terencezhou…
json-schema.apifox.cn/
www.nuomiphp.com/a/stackover…
到此这篇关于java校验json的格式是否符合要求的文章就介绍到这了,更多相关java校验json格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
关键词:
为你推荐
-
java校验json的格式是否符合要求的操作方法
-
环球动态:圆通 下单 圆通电话下单
-
每日快讯!世界读书日 重庆各大高校学子这样“读书”
-
世界信息:货场帆布篷布_货场帆布
-
今日热讯:欧轩伟
-
世界热推荐:成都金银街周日(4月23日)黄金价格报价555元/克
-
快资讯丨英雄母亲的一天_关于英雄母亲的一天的简介
-
如何规范公园开放帐篷区管理和“夜市”设摊?市绿化市容局解读 环球短讯
-
热头条丨健康老龄化如何“跑赢”人口老龄化?
-
最新sci期刊查询及投稿分析系统_求助 如何查询SCI收录号
-
五一假期收费公路小型客车免费通行|天天观热点
-
共话中国经济新机遇丨专访:“中国供应链在过去三年中表现出强大韧性和竞争力”——访空中客车公司首席执行官纪尧姆·傅里
-
樱桃、桑葚、蓝莓、蜜桃、葡萄……武汉这个百亩果园结出10余种水果
-
预防近视手抄报内容_预防近视手抄报内容-环球新视野
-
世界观天下!2016秋 东北铁道旅+神户马拉松10日行|D4-2|日本三景松岛——松岛湾游览船
-
天天即时看!心脏·血管外科学
-
焦点滚动:干贝太咸了怎么处理(干贝太咸怎么去掉咸味)
-
如何种植木瓜树_世界速读
-
小米上亿资产遭冻结 申诉被印度驳回 回应称等待书面命令
-
焦点消息!假如王一博来演灌篮高手,你认同吗?
推荐内容
- java校验json的格式是否符合要求的操作方法
- 环球动态:圆通 下单 圆通电话下单
- 每日快讯!世界读书日 重庆各大高校学子这样“读
- 世界信息:货场帆布篷布_货场帆布
- 今日热讯:欧轩伟
- 世界热推荐:成都金银街周日(4月23日)黄金价格
- 快资讯丨英雄母亲的一天_关于英雄母亲的一天的简介
- 如何规范公园开放帐篷区管理和“夜市”设摊?市绿
- 热头条丨健康老龄化如何“跑赢”人口老龄化?
- 最新sci期刊查询及投稿分析系统_求助 如何查询SC
- 五一假期收费公路小型客车免费通行|天天观热点
- 共话中国经济新机遇丨专访:“中国供应链在过去三
- 樱桃、桑葚、蓝莓、蜜桃、葡萄……武汉这个百亩果
- 预防近视手抄报内容_预防近视手抄报内容-环球新视
- 世界观天下!2016秋 东北铁道旅+神户马拉松10日
- 天天即时看!心脏·血管外科学
- 焦点滚动:干贝太咸了怎么处理(干贝太咸怎么去掉
- 如何种植木瓜树_世界速读
- 小米上亿资产遭冻结 申诉被印度驳回 回应称等待
- 焦点消息!假如王一博来演灌篮高手,你认同吗?
- 【全球新要闻】出路的意思是_出路的意思
- 天天热头条丨上纬新材:2023年第一季度净利润约17
- 宁德时代发布凝聚态电池 环球通讯
- 益生菌的功效与作用_益生菌对宝宝的作用
- 莱音珠宝铂金多少钱一克(2023年04月23日)参考价
- 深圳龙岗5.2亿挂牌4宗产业用地 其中3宗用于宝龙
- 河南省信阳市2023-04-23 10:45发布雷暴大风黄色
- 当前快讯:京津冀武术名家比拼“独门绝技”
- 即时焦点:mp3不支持格式怎么办_mp3格式不对怎么办
- 全球关注:通州这个名字,居然是金朝皇帝起的
- 快资讯丨17+8+11!哈登持续低迷,76人横扫篮网,
- 商务部:中国有意愿、有能力加入CPTPP_当前要闻
- 世界快看:女性背部筋膜炎的症状及治疗_背部筋膜
- 情歌王古巨基_古巨基情歌王歌词
- 焦点讯息:整治老旧小区“飞线”需持续加力
- 【聚看点】百亿市场更近一步 科兴制药长效GC完成
- 温州公交“全民阅读专线”上路运行_世界今日报
- 美国CDC提醒注意这一新冠新变种:或致眼睛发红发
- 天天关注:灾难级表现!小莫里斯半场7中1&三分4中
- 科教融合 科创属性 创新生态 市场导向 天开高
油气
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
经济
-
中新网通辽10月18日电 (记者 张林虎)18日,记者从内蒙古自治区通辽市奈曼旗公安局获悉,国家一级保护动物--梅花鹿误入当地村民羊群,
-
中新网杭州10月18日电 (王题题 胡燕婕)云天收夏色,浅秋正渐浓。10月18日,浙江杭州市西湖游船有限公司推出的惠民多站点“西湖环湖游
-
中新网福州10月18日电 (记者 龙敏 王东明)福州市晋安区官方18日晚间通报,18日14时47分,晋安区岳峰镇化工路爱摩轮商业广场项目摩天
-
中新网兰州10月18日电 (闫姣 艾庆龙 吉翔)“红山白土头,黄河向西流。”不少人疑问,天下黄河向东流,为何甘肃永靖县这段黄河却向西
-
中新网北京10月18日电 《清华城市健康设施指数》18日在北京发布。报告成果显示,城市健康设施指数领先城市以中心城市和东部沿海城市