我正在使用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
inside的第 0 个实例configuration
。但是我仍然认为最好获得遇到问题的行号。