2011-12-14 14 views
64

json.net (newtonsoft)
Sto osservando la documentazione ma non riesco a trovare nulla su questo o il modo migliore per farlo.Json.net serializza/deserializza i tipi derivati?

public class Base 
{ 
    public string Name; 
} 
public class Derived : Base 
{ 
    public string Something; 
} 

JsonConvert.Deserialize<List<Base>>(text); 

Ora ho oggetti derivati ​​nella lista serializzata. Come faccio a deserializzare l'elenco e recuperare i tipi derivati?

+0

Non è così che funziona l'eredità. È possibile specificare JsonConvert.Deserialize (testo); per includere il campo Nome. Poiché Derived ** IS A ** Base (non il contrario), Base non sa nulla della definizione di Derived. –

+0

Scusate, chiarito un po '. Il problema è che ho una lista che contiene sia oggetti di base che derivati. Quindi ho bisogno di capire come dico a newtonsoft come deserializzare gli oggetti derivati. – Will

+0

L'ho risolto? Ho lo stesso problema –

risposta

26

Se si memorizza il tipo nel proprio text (come dovrebbe essere in questo scenario), è possibile utilizzare JsonSerializerSettings.

See: how to deserialize JSON into IEnumerable<BaseType> with Newtonsoft JSON.NET

+14

Puoi anche usare 'TypeNameHandling = TypeNameHandling.Auto' - questo aggiungerà SOLO una proprietà' $ type' per le istanze in cui il tipo dichiarato (cioè 'Base') non corrisponde al tipo di istanza (es. '). In questo modo, non gonfia il tuo JSON tanto quanto "TypeNameHandling.All'. –

+0

Continuo a ricevere Errore durante la risoluzione del tipo specificato in JSON '..., ...'. Percorso '$ tipo', linea 1, posizione 82. Qualche idea? – Crasher

67

Devi abilitare Tipo Nome Manipolazione e passare che per il serializzatore (de) come parametro impostazioni.

Base object1 = new Base() { name = "Object1" }; 
Derived object2 = new Derived() { something = "Some other thing" }; 
List<Base> inheritanceList = new List<Base>() { object1, object2 }; 

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; 
string Serialized = JsonConvert.SerializeObject(inheritanceList, settings); 
List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings); 

Ciò comporterà corretta desirialization di classi derivate. Uno svantaggio è che assegnerà un nome a tutti gli oggetti che si stanno utilizzando, pertanto assegnerà un nome alla lista in cui si stanno inserendo gli oggetti.

+22

+1. Sono stato googling per 30 minuti fino a quando ho scoperto che è necessario utilizzare le stesse impostazioni per SerializeObject e DeserializeObject. Supponevo che usasse implicitamente il tipo $ se è lì quando deserializza, sciocca me. –

+14

'TypeNameHandling.Auto' lo farà anche, ed è più bello perché non scrive il nome del tipo di istanza quando corrisponde al tipo di campo/proprietà, che è spesso il caso per la maggior parte dei campi/proprietà. –

+0

Grazie per aver salvato la mia giornata :) –

Problemi correlati