天天看點

Json.net說法——(四)序列化錯誤處理

序列化錯誤處理

json.net支援序列化和反序列化錯誤處理。錯誤處理可以捕捉錯誤并且可以選擇處理錯誤且繼續序列化或把從程式中錯誤抛出。

定義錯誤處理有兩種方法:錯誤事件和錯誤修飾标簽。

(一)事件處理

List<string> errors = new List<string>();

List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(@"[

      ""2009-09-09T00:00:00Z"",

      ""不能轉換為日期"",

      [

        1

      ],

      ""1977-02-20T00:00:00Z"",

      null,

      ""2000-12-01T00:00:00Z""

    ]",

  new JsonSerializerSettings

  {

      Error =delegate(object obj,Newtonsoft.Json.Serialization.ErrorEventArgs args)

      {

        errors.Add(args.ErrorContext.Error.Message);

        args.ErrorContext.Handled = true;

      },

      Converters ={new IsoDateTimeConverter()}

  });

foreach (DateTime dd in c)

{

    Console.WriteLine(dd.ToString());

}

泛型清單c是一個日期類型的集合,其中有3個值不能成功序列化。如果不添加錯誤事件處理,則序列化出現錯誤。但通過錯誤事件處理,捕捉了其中的異常并使序列化繼續下去。

輸出結果:

/*

2009-9-9 0:00:00

1977-2-20 0:00:00

2000-12-1 0:00:00

*/

new JsonSerializerSettings

      Converters ={new IsoDateTimeConverter()}   

在系列化設定中,添加錯誤事件處理:

·Error屬性是一個泛型委托:

EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs> fun =

delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)

  errors.Add(args.ErrorContext.Error.Message);

  args.ErrorContext.Handled = true;

};

這個例子中把一個json反序列化為一個日期集合。在序列化設定過程中為錯誤事件配置設定一個處理器,這個處理器用于記錄錯誤資訊并且标記這些錯誤是經過處理的。

這個json反序列化的結果是:有3個反序列化的日期對象和3個錯誤資訊,

·該字元串未被識别為有效的 DateTime。有一個從索引 0 處開始的未知字。

·Unexpected token parsing date. Expected String, got StartArray.

·Cannot convert null value to System.DateTime.

(二)屬性标簽

json.net支援的這種屬性标簽很像其它.net序列化标簽。隻要用它來修飾方法并設定正确的參數即可。它的修飾的方法的參數有:StreamingContext和ErrorContext。而方法名無關。

public class PersonError

List<string> _list;

public string Name { get; set; }

public int Age { get; set; }

public List<string> HorseList

    get

    {

if (_list == null)

           throw new Exception("Roles not loaded!");

return _list;

    }

    set { _list = value; }

public string Memo { get; set; }

[OnError]

internal void OnError(StreamingContext context, ErrorContext errorContext)

    errorContext.Handled = true;

PersonError person = new PersonError

    Name = "宋江",

    Age = 32,

    HorseList =null,

    Memo = "天魁星"

string json = JsonConvert.SerializeObject(person, Formatting.Indented);

Console.WriteLine(json);

在這個例子中,通路HorseList屬性時如果沒有元素則會抛出異常。被屬性标簽修飾的方法會在序列化HorseList時處理錯誤并使序列化繼續序列化類。

結果:

"Name": "宋江",

"Age": 32,

"Memo": "天魁星"

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園