2011-12-14 22 views
64

json.net (newtonsoft)
Estoy revisando la documentación, pero no encuentro nada sobre esta o la mejor manera de hacerlo.Json.net serializar/deserializar los tipos derivados?

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

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

Ahora tengo objetos Derivados en la lista serializada. ¿Cómo deserializo la lista y recupero los tipos derivados?

+0

No es así como funciona la herencia. Puede especificar JsonConvert.Deserialize (texto); para incluir el campo Nombre. Como Derived ** IS A ** Base (no al revés), Base no sabe nada sobre la definición de Derived. –

+0

Disculpe, aclarado un poco. El problema es que tengo una lista que contiene objetos base y derivados. Entonces necesito descubrir cómo le digo a Newtonsoft cómo deserializar los artículos derivados. – Will

+0

Resolví esto. Tengo el mismo problema –

Respuesta

26

Si está almacenando el tipo en su text (como debe ser en este escenario), puede usar el JsonSerializerSettings.

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

+14

También puede usar 'TypeNameHandling = TypeNameHandling.Auto' - esto agregará una propiedad' $ type' SOLAMENTE para las instancias donde el tipo declarado (es decir, 'Base') no coincide con el tipo de instancia (es decir,' Derived '). De esta forma, no hincha tanto tu JSON como 'TypeNameHandling.All'. –

+0

Sigo recibiendo el tipo de resolución de error especificado en JSON '..., ...'. Ruta '$ type', línea 1, posición 82. ¿Alguna idea? – Crasher

67

Tiene que activar Tipo Nombre Manipulación y pasar a que el serializador (de) como un parámetro de configuración.

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); 

Esto dará como resultado la correcta desirialización de las clases derivadas. Un inconveniente es que nombrará todos los objetos que está utilizando, por lo que nombrará la lista en la que está colocando los objetos.

+22

+1. Estuve buscando en Google durante 30 minutos hasta que descubrí que necesita usar la misma configuración para SerializeObject & DeserializeObject. Supuse que usaría $ type implícitamente si está ahí cuando se deserializa, tonto. –

+14

'TypeNameHandling.Auto' también lo hará, y es más agradable porque no escribe el nombre de tipo de instancia cuando coincide con el tipo del campo/propiedad, que a menudo es el caso para la mayoría de los campos/propiedades. –

+0

Gracias por salvarme el día :) –

Cuestiones relacionadas