2014-09-29 3 views
33

У меня есть объект с заранее определенной структурой данных:Игнорировать разбор ошибок во время данных Json.NET разбор

public class A 
{ 
    public string Id {get;set;} 
    public bool? Enabled {get;set;} 
    public int? Age {get;set;} 
} 

и JSON должен быть

{ "Id": "123", "Enabled": true, "Age": 23 } 

Я хочу, чтобы обрабатывать ошибки JSON в позитивном ключе , и всякий раз, когда сервер возвращает неожиданные значения для определенных типов данных, я хочу, чтобы он игнорировался, и значение по умолчанию установлено (null).

Сейчас, когда JSON частично недействительным я получаю исключение для чтения JSON:

{ "Id": "123", "Enabled": "NotABoolValue", "Age": 23 } 

И я не получаю никакого объекта вообще. То, что я хочу, чтобы получить объект:

new A() { Id = "123", Enabled = null, Age = 23 } 

и синтаксического анализа предупреждение, если это возможно. Можно ли выполнить с JSON.NET?

ответ

61

Чтобы иметь возможность обрабатывать ошибки десериализации, используйте следующий код:

var a = JsonConvert.DeserializeObject<A>("-- JSON STRING --", new JsonSerializerSettings 
    { 
     Error = HandleDeserializationError 
    }); 

где HandleDeserializationError является следующий метод:

public void HandleDeserializationError(object sender, ErrorEventArgs errorArgs) 
{ 
    var currentError = errorArgs.ErrorContext.Error.Message; 
    errorArgs.ErrorContext.Handled = true; 
} 

HandleDeserializationError будет называться столько раз, сколько есть ошибки в строке json. Свойства, вызывающие ошибку, не будут инициализированы.

+1

работает просто отлично. Это именно то, что я искал! Спасибо –

+17

Обратите внимание, что ErrorEventArgs - это Newtonsoft.Json.Serialization.ErrorEventArgs, а не System.IO.ErrorEventArgs. –

+0

Отличный! Эта работа! – Yonedev

Смежные вопросы