2013-05-15 7 views
8

Ich habe eine große JSON-Datenmenge, die ich deserialize muss. Ich benutze Json.net JsonTextReader, um die Daten zu lesen.Deserialize abgeleitete Klassen mit Json.net ohne JObject

Mein Problem ist, dass ich einige abgeleitete Klassen deserialisieren muss, so dass ich in der Lage sein muss, nach einer bestimmten Eigenschaft zu suchen, die meinen Datentyp definiert. Im folgenden Beispiel wird der Parameter "type" verwendet, um den zu deserialisierenden Objekttyp zu bestimmen.

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

Meine abgeleiteten Objekte können stark verschachtelt und sehr tief sein. Das Laden des gesamten Datensatzes im Speicher ist nicht erwünscht, da viel Speicher benötigt wird. Sobald ich zum "bigData" -Objekt komme, werde ich die Daten verarbeiten (wie das Array im obigen Beispiel), aber es wird nicht im Speicher gespeichert (es ist zu groß).

Alle Lösungen zu meinem Problem, die ich bisher gesehen habe, haben JObject verwendet, um die Teilobjekte zu deserialisieren. Ich möchte vermeiden, JObject zu verwenden, da es jedes Objekt in der Hierarchie wiederholt deserialisiert.

Wie kann ich mein Deserialisierungsproblem lösen?

Gibt es eine Möglichkeit, nach dem Parameter "type" zu suchen, und dann zurück zum Anfang des {Charakters des Objekts, um die Verarbeitung zu starten?

+0

können Sie nicht tun, weg mit dem Typ-Feld und geben Sie den Typ manuell in der Klasse an, zu der Sie deserialisieren? Vorausgesetzt, die Typen ändern sich nicht ständig. –

Antwort

1

Mir ist sowieso nicht bewusst, das Laden des Objekts zu übernehmen, um ein Lookahead anzugeben (zumindest nicht in Json.NET), aber Sie könnten die anderen attributbasierten Konfigurationselemente verwenden, um unerwünschte zu ignorieren Eigenschaften: Alternativ

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

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

, können Sie custom creation converters einen Versuch geben:

Zum Beispiel ..

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); 
    } 
} 
Verwandte Themen