2013-05-15 16 views
8

Ho un grande set di dati JSON che devo deserializzare. Sto usando Jawa.net JsonTextReader per leggere i dati.Deserializzare le classi derivate utilizzando Json.net senza utilizzare JObject

Il mio problema è che ho bisogno di deserializzare alcune classi derivate, quindi devo essere in grado di "guardare avanti" per una particolare proprietà che definisce il mio tipo di dati. Nell'esempio seguente, il parametro "tipo" viene utilizzato per determinare il tipo di oggetto da deserializzare.

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

I miei oggetti derivati ​​possono essere fortemente nidificati e molto profondi. Caricare l'intero set di dati in memoria non è desiderato poiché richiederà molta memoria. Una volta arrivato all'oggetto "bigData", elaborerò i dati (come la matrice nell'esempio sopra), ma non verranno archiviati in memoria (è troppo grande).

Tutte le soluzioni al mio problema che ho visto finora hanno utilizzato JObject per deserializzare gli oggetti parziali. Voglio evitare di usare JObject perché deserializza ripetutamente ogni oggetto lungo la gerarchia.

Come posso risolvere il mio problema di deserializzazione?

Esiste un modo per cercare in anticipo il parametro "tipo", quindi tornare all'inizio del carattere {del carattere dell'oggetto per avviare l'elaborazione?

+0

non riesci a farla finita con il campo di tipo e specificare il tipo manualmente nella classe in cui si deserializza? Fornire i tipi non cambia tutto il tempo che è. –

risposta

1

Non sono a conoscenza dell'eliminazione del caricamento nell'oggetto per specificare un lookahead (almeno non in Json.NET) ma è possibile utilizzare gli altri elementi di configurazione basati sugli attributi a propria disposizione per ignorare indesiderati proprietà:

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

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

In alternativa, si può dare una prova custom creation converters:

Per esempio ..

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); 
    } 
} 
Problemi correlati