2015-02-27 7 views
1

Я использую 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. Однако я все еще думаю, что лучше получить номер строки, которая столкнулась с проблемой.

ответ

0

(библиотека автор здесь)

В то время как это можно сделать (у меня где-то реализацию JsonParser, которая делает именно это) проблема заключается в том, что информация линия/столбец будет большую часть времени быть не имеет значения.

Чтобы сохранить пропускную способность, большую часть времени JSON, отправленный по кабелю, всегда будет находиться на одной линии, поэтому проблема останется, что вы получите, скажем, «строка 1, столбец 202», без каких-либо умнее.

Я, вероятно, сделать это в любом случае для следующей версии, но для 2.2.x это слишком поздно ...

+0

Yep спасибо за ответ, мы уже говорили на GitHub на это, в любом случае будет пытаться это слишком – Mahesha999