2014-07-16 89 views
3

在我的c#應用程序中,我使用json.net庫來處理jsons。
我的情況:在json.net中錯誤類型導致的反序列化時忽略屬性

物業:

[JsonProperty("my_test_property_json_key", NullValueHandling = NullValueHandling.Ignore)] 
public int[] MyTestProperty{ get; set; } 

當我的則此屬性JSON的樣子:

[0,1,2,3,4,5] 

所有的偉大工程。 但可能發生的情況,當我有這樣錯誤的JSON值:

[[0,1,2,3]] 

而且在這種情況下,我得到異常:

[Newtonsoft.Json.JsonReaderException] = {"Error reading integer. Unexpected token: StartArray. Path 'my_test_property_json_key[0]', line 1, position 3250."} 

在這種情況下,正確的行爲應該是:
返回空int[]

當我錯誤的json(屬性存在,但它是一個不同的類型)時,我怎麼能忽略這個屬性?注意:我的json太大(很多其他屬性) - 我不能用默認數據重新創建它(我不能丟失數據)。

回答

2

如果數據不正確,你可以創建一個試圖讀取一個整數數組,並返回一個空數組自定義轉換器:

class MyCustomInt32ArrayConverter : JsonConverter 
{ 
    public override object ReadJson(
     JsonReader reader, 
     Type objectType, 
     Object existingValue, 
     JsonSerializer serializer) 
    { 
     var array = serializer.Deserialize(reader) as JArray; 
     if (array != null) 
     { 
      return array.Where(token => token.Type == JTokenType.Integer) 
         .Select(token => token.Value<int>()) 
         .ToArray(); 
     } 
     return new int[0]; 
    } 

    public override void WriteJson(
     JsonWriter writer, 
     Object value, 
     JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, value); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(int[]); 
    } 
} 

只是用轉換器適用於財產JsonConverterAttribute屬性:

[JsonConverterAttribute(typeof(MyCustomInt32ArrayConverter))] 
[JsonProperty("my_test_property_json_key", NullValueHandling = NullValueHandling.Ignore)] 
public int[] MyTestProperty{ get; set; } 
+0

爲什麼在'WriteJson'中拋出異常? '也可以轉換'(( – jimpanzer

+0

@ jimpanzer,這只是一個基本的例子,我沒有打算完全實現它。)如果你想要序列化和反序列化,只需要實現WriteJson和CanConvert。 –

+0

@jimpanzer,我更新了答案, –

相關問題