2013-05-15 62 views
8

我有一個大的json數據集,需要反序列化。我正在使用Json.net的JsonTextReader來讀取數據。使用Json.net反序列化派生類而不使用JObject

我的問題是我需要反序列化一些派生類,所以我需要能夠「向前看」定義我的數據類型的特定屬性。在下面的示例中,「type」參數用於確定要反序列化的對象類型。

{ 
    type: "groupData", 
    groupParam: "groupValue1", 
    nestedObject: 
    { 
    type: "groupData", 
    groupParam: "groupValue2", 
    nestedObject: 
    { 
     type: "bigData", 
     arrayData: [ ... ] 
    } 
    } 

我的派生對象可以是嵌套的嚴重和非常深。將整個數據集加載到內存中是不需要的,因爲它需要很多內存。一旦我回到「bigData」對象,我將處理數據(例如上面示例中的數組),但它不會存儲在內存中(它太大)。

到目前爲止,我所見過的所有解決方案都利用了JObject來反序列化部分對象。我想避免使用JObject,因爲它會反覆反序列化層次結構中的每個對象。

我該如何解決我的反序列化問題?

有什麼方法可以提前搜索「type」參數,然後回溯到對象的{字符開始處理?

+0

你能不能用類型字段做掉並在反序列化的類中手動指定類型?提供類型不會一直改變。 –

回答

1

我還沒有意識到爲了指定一個超前(至少不是在Json.NET中)而預先加載對象,但是您可以使用其他基於屬性的配置項來處理,以忽略不需要的屬性:

public class GroupData { 
    [JsonIgnore] 
    public string groupParam { get; set; } 
    [JsonIgnore] 
    public GroupData nestedObject { get; set; } 

    public string[] arrayData { get; set; } 
} 

或者,你可以給custom creation converters一試:

例如..

public class GroupData { 
    [JsonIgnore] 
    public string groupParam { get; set; } 
    [JsonIgnore] 
    public GroupData nestedObject { get; set; } 
} 

public class BigData : GroupData { 
    public string[] arrayData { get; set; } 
} 

public class ObjectConverter<T> : CustomCreationConverter<T> 
{ 
    public ObjectConverter() { } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType.Name == "BigData"; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // Some additional checks/work? 
     serializer.Populate(reader, target); 
    } 
}