我们如何从json-schema验证器中的处理报告中提取所有消息

时间:2013-12-20 11:40:26

标签: jsonschema

我正在使用json-schema验证器来验证json数据。如果发生任何错误,它将生成一个报告。但我想向用户显示错误,报告太大,所以我只想显示错误消息。

这是我的报告

----------报告-------------

com.github.fge.jsonschema.report.ListProcessingReport:失败

---开始消息---

错误:实例无法匹配4个

中至少一个必需的架构
level: "error"
schema: {"loadingURI":"#","pointer":"/properties/question-groups/items"}
instance: {"pointer":"/question-groups/0"}
domain: "validation"
keyword: "anyOf"
nrSchemas: 4
reports: {"/properties/question-groups/items/anyOf/0":[{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/multiple-choice/properties/evaluation-key/properties/options/items"},"instance":{"pointer":"/question-groups/0/evaluation-key/options/0"},"domain":"validation","keyword":"allOf","message":"instance failed to match all required schemas (matched only 0 out of 1)","matched":0,"nrSchemas":1,"reports":{"/definitions/multiple-choice/properties/evaluation-key/properties/options/items/allOf/0":[{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/multiple-choice/properties/evaluation-key/properties/options/items/allOf/0/properties/score"},"instance":{"pointer":"/question-groups/0/evaluation-key/options/0/score"},"domain":"validation","keyword":"type","message":"instance type (string) does not match any allowed primitive type (allowed: [\"integer\"])","found":"string","expected":["integer"]}]}}],"/properties/question-groups/items/anyOf/1":[{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/text/properties/evaluation-key"},"instance":{"pointer":"/question-groups/0/evaluation-key"},"domain":"validation","keyword":"additionalProperties","message":"object instance has properties which are not allowed by the schema: [\"options\"]","unwanted":["options"]},{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/text/properties/evaluation-key"},"instance":{"pointer":"/question-groups/0/evaluation-key"},"domain":"validation","keyword":"required","message":"object has missing required properties ([\"scorers\"])","required":["scorers"],"missing":["scorers"]},{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/text/properties/type"},"instance":{"pointer":"/question-groups/0/type"},"domain":"validation","keyword":"enum","message":"instance value (\"multiple-choice\") not found in enum (possible values: [\"text\"])","value":"multiple-choice","enum":["text"]}],"/properties/question-groups/items/anyOf/2":[{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/numeric/properties/evaluation-key"},"instance":{"pointer":"/question-groups/0/evaluation-key"},"domain":"validation","keyword":"additionalProperties","message":"object instance has properties which are not allowed by the schema: [\"options\"]","unwanted":["options"]},{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/numeric/properties/evaluation-key"},"instance":{"pointer":"/question-groups/0/evaluation-key"},"domain":"validation","keyword":"required","message":"object has missing required properties ([\"scorers\"])","required":["scorers"],"missing":["scorers"]},{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/numeric/properties/type"},"instance":{"pointer":"/question-groups/0/type"},"domain":"validation","keyword":"enum","message":"instance value (\"multiple-choice\") not found in enum (possible values: [\"numeric\"])","value":"multiple-choice","enum":["numeric"]}],"/properties/question-groups/items/anyOf/3":[{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/table"},"instance":{"pointer":"/question-groups/0"},"domain":"validation","keyword":"anyOf","message":"instance failed to match at least one required schema among 2","nrSchemas":2,"reports":{"/definitions/table/anyOf/0":[{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/table/anyOf/0"},"instance":{"pointer":"/question-groups/0"},"domain":"validation","keyword":"required","message":"object has missing required properties ([\"cells\"])","required":["cells","evaluation-key","group-id","question-text","type"],"missing":["cells"]}],"/definitions/table/anyOf/1":[{"level":"error","schema":{"loadingURI":"#","pointer":"/definitions/table/anyOf/1"},"instance":{"pointer":"/question-groups/0"},"domain":"validation","keyword":"required","message":"object has missing required properties ([\"cells\",\"matching-unit\"])","required":["cells","evaluation-key","group-id","matching-unit","question-text","type"],"missing":["cells","matching-unit"]}]}}]}

---结束消息---

我如何才能收到错误消息,任何建议都会有所帮助。

谢谢

somu

3 个答案:

答案 0 :(得分:2)

您可以将报告作为JsonNode读取,并从中获取所需的参数。

ProcessingReport report;
ProcessingMessage message;

report = schema.validate(jsonData);
Iterator itr = report.iterator();

while(itr.hasNext())
{
    message = (ProcessingMessage) itr.next();
        System.out.println("Message" + message.asJson().get("message").asText());
 System.out.println("Reports" + message.asJson().get("reports").asText());

}

答案 1 :(得分:0)

您应该遍历所有消息,并仅选择将getLogLevel()与LogLevel.ERROR进行比较的错误。对我有用

Iterator<ProcessingMessage> itr = report.iterator();
while(itr.hasNext())
{
    ProcessingMessage message = (ProcessingMessage) itr.next();
    if(message.getLogLevel().equals(LogLevel.ERROR)){
        System.out.println(message.toString());
    }
}

答案 2 :(得分:-1)

您可以使用以下方法

String getErrorsList(ProcessingReport report, boolean onlyErrors) {
    StringBuilder jsonValidationErrors = new StringBuilder();
    for (ProcessingMessage processingMessage : report) {
        if(onlyErrors && LogLevel.ERROR.equals(processingMessage.getLogLevel())) {
            jsonValidationErrors.append(processingMessage.getMessage()).append("\n\r");
        } else if(!onlyErrors) {
            jsonValidationErrors.append(processingMessage.getMessage()).append("\n\r");
        }
    }
    return jsonValidationErrors.toString();
}