3

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

4

1 回答 1

0

(图书馆作者在这里)

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

为了节省带宽,大多数情况下,通过网络发送的 JSON 将始终位于单行上,因此问题仍然存在,例如,您会得到“第 1 行,第 202 列”而不会变得更聪明。

无论如何,我可能会在下一个主要版本中这样做,但对于 2.2.x 来说为时已晚......

于 2015-02-28T10:42:47.153 回答