2014-09-29 64 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

工作很好。這正是我期待的!謝謝 – 2014-09-30 17:10:44

+17

請注意,ErrorEventArgs是Newtonsoft.Json.Serialization.ErrorEventArgs而不是System.IO.ErrorEventArgs。 – 2016-03-08 18:41:54

+0

優秀!這項工作! – Yonedev 2017-04-01 20:00:47