获取json验证失败的json文件的行号

时间:2015-02-27 09:52:55

标签: json jsonschema json-schema-validator

我正在使用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出现问题的情况,在这种情况下是skipHeaderconfiguration的第0个实例。但是我仍然认为更好地获得遇到问题的行号。

1 个答案:

答案 0 :(得分:0)

(图书馆作者在这里)

虽然可以这样做(我有一个JsonParser的实现就是这样)但问题是线/列信息在大多数情况下都是无关紧要的。

为了节省带宽,大多数情况下,通过线路发送的JSON总是在一条线上,因此问题仍然存在,例如,&#34;第1行,第202行和第34行;没有任何更聪明的人。

我可能会为下一个主要版本做这个,但对于2.2.x来说太晚了......