Я использую json-schema-validator для проверки моего json.Получение номера строки json-файла, при которой не удалось выполнить проверку 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
является в проблему и в этом случае его 0-й экземпляр skipHeader
внутри configuration
. Однако я все еще думаю, что лучше получить номер строки, которая столкнулась с проблемой.
Yep спасибо за ответ, мы уже говорили на GitHub на это, в любом случае будет пытаться это слишком – Mahesha999