您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

java怎么校验json的格式是否符合要求

2024/5/29 20:11:25发布14次查看
json schemajson schema 是用于验证 json 数据结构的强大工具,schema可以理解为模式或者规则。
json schema定义了一套词汇和规则,这套词汇和规则用来定义json元数据,且元数据也是通过json数据形式表达的。json元数据定义了json数据需要满足的规范,规范包括成员、结构、类型、约束等。
json schema 就是json的格式描述、定义、模板,有了他就可以生成任何符合要求的json数据
json-schema-validator在java中,对json数据格式的校验,使用 json-schema-validator,具体实例如下:
1. 引入依赖 <dependency> <groupid>com.github.fge</groupid> <artifactid>json-schema-validator</artifactid> <version>2.2.6</version> </dependency> <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-core</artifactid> <version>2.3.0</version> </dependency>
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) { map<string, string> map = 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(); map<string, object> body = new hashmap<>(); hashmap<string, object> one = new hashmap<string, object>() {{ put("name", "王小明"); put("sex", "男"); put("age", 18); }}; hashmap<string, object> two = new hashmap<string, object>() {{ 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 数组的第一条数据,其他的有错误也不会报错!!
以上就是java怎么校验json的格式是否符合要求的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product