我正在使用json-schema-validator来验证我的json。
我想在json数据文件中显示验证失败的行号。我想以用户友好的方式显示失败消息。 我得到指向json节点的指针,其中验证失败可能发生如下:
JsonNode jsondatanode = JsonLoader.fromFile(new File("jsondata.json"));
JsonNode jsonschemanode = JsonLoader.fromFile(new File("jsonschema.json"));
final JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
final JsonSchema datastoreschema = factory.getJsonSchema(jsonschemanode);
ProcessingReport report;
report = datastoreschema.validate(jsondatanode);
然而,当json文件包含指针指定的许多类型的节点时,指针不方便定位json对象/属性。
我收到了以下验证失败消息:
--- BEGIN MESSAGES ---
error: instance value (12) not found in enum (possible values:["true","false","y","n","yes","no",0,1])
level: "error"
schema: {"loadingURI":"#","pointer":"/properties/configuration/items/properties/skipHeader"}
instance: {"pointer":"/configuration/0/skipHeader"}
domain: "validation"
keyword: "enum"
value: 12
enum: ["true","false","y","n","yes","no",0,1]
--- END MESSAGES ---
我想用json数据文件中的行号显示验证失败的自定义消息,导致架构验证失败。我知道我可以访问验证报告的各个细节,如下面的代码所示。
我想按如下方式显示自定义消息:
List<ProcessingMessage> messages = Lists.newArrayList((AbstractProcessingReport)report);
JsonNode reportJson = messages.get(0).asJson();
if(reportJson.get("keyword").toString().equals("enum"))
{
System.out.println("Value "+report.Json.get("value").toString() +"is invalid in " + filepath + " at line " + linenumber);
}
else if{
//...
}
//...
我不明白的是如何在上面的代码中获得linenumber
变量。
修改
现在我意识到了
instance: {"pointer":"/configuration/0/skipHeader"}
显示skipHeader
出现问题的情况,在这种情况下是skipHeader
内configuration
的第0个实例。但是我仍然认为更好地获得遇到问题的行号。
答案 0 :(得分:0)
(图书馆作者在这里)
虽然可以这样做(我有一个JsonParser
的实现就是这样)但问题是线/列信息在大多数情况下都是无关紧要的。
为了节省带宽,大多数情况下,通过线路发送的JSON总是在一条线上,因此问题仍然存在,例如,&#34;第1行,第202行和第34行;没有任何更聪明的人。
我可能会为下一个主要版本做这个,但对于2.2.x来说太晚了......