2013-05-15 13 views
8

Mam duży zbiór danych Json, który muszę deserializować. Korzystam z Json.net z JsonTextReader, aby odczytać dane.Deserializować klasy pochodne przy użyciu Json.net bez używania JObject

Mój problem polega na tym, że muszę deserializować niektóre pochodne klasy, więc muszę mieć możliwość "patrzenia w przyszłość" dla określonej właściwości określającej mój typ danych. W poniższym przykładzie parametr "typ" służy do określenia typu obiektu do deserializacji.

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

Moje pochodne obiekty mogą być mocno zagnieżdżone i bardzo głębokie. Ładowanie całego zbioru danych w pamięci nie jest pożądane, ponieważ będzie wymagało dużej ilości pamięci. Gdy przejdę do obiektu "bigData", będę przetwarzał dane (takie jak tablica w powyższym przykładzie), ale nie będzie on przechowywany w pamięci (jest zbyt duży).

Wszystkie rozwiązania mojego problemu, które widziałem do tej pory, wykorzystały JObject do deserializacji częściowych obiektów. Chcę uniknąć używania JObject, ponieważ będzie deserializować każdy obiekt w dół hierarchii wielokrotnie.

Jak mogę rozwiązać problem z deserializacją?

Czy istnieje sposób na przeszukanie parametru "type", a następnie powrót do początku {obiektu, aby rozpocząć przetwarzanie obiektu?

+0

nie można zrobić, uciec z pola typu i określić typ ręcznie w klasie, z której deserializujesz? Podawanie typów nie zmienia się przez cały czas. –

Odpowiedz

1

Nie zdaję sobie sprawy z tego, że należy wcześniej załadować obiekt, aby określić wcześniejszy widok (przynajmniej nie w Json.NET), ale można użyć innych elementów konfiguracji opartych na atrybutach, aby zignorować niechciane elementy właściwości:

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

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

Alternatywnie, można dać custom creation converters spróbować:

na przykład ..

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); 
    } 
} 
Powiązane problemy