2012-09-12 8 views
9

Deserializo la cadena JSON al objeto raíz utilizando la siguiente clase que funciona bien.¿Por qué JSON.NET no funciona con la herencia mientras se deserializa?

[Serializable] 
    public class MoviesListRootObject 
    { 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
     public List<Response> response { get; set; } 
    } 

...................................

var json = wc.DownloadString(jsonRequestURL); 
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json); 

Pero si estoy generalizando el objeto raíz bt creando la clase padre y luego heredando de ella, ¡entonces obtengo nulo después de la deserialización!

[Serializable] 
    public class RootObject 
    { 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
    } 

[Serializable] 
    public class MoviesListRootObject:RootObject 
    { 
     public List<MovieResponse> movieResponse { get; set; } 

    } 

........................................... ...

var json = wc.DownloadString(jsonRequestURL); 
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json); 
+1

es mejor si incluye la cadena JSON de muestra. –

+0

Intente utilizar la configuración mencionada en esta otra respuesta: http://stackoverflow.com/a/6495299/146656 o aplique '[JsonObject (MemberSerialization.OptIn)]' a la declaración de la clase base como se sugiere en http: // stackoverflow .com/a/6451204/146656 Si ambos fallan, consulte el enfoque personalizado en esta publicación del blog http://dotnetbyexample.blogspot.com.au/2012/02/json-deserialization-with-jsonnet-class.html – Meligy

Respuesta

0

Suponiendo cadena JSON tiene el siguiente

{"movieResponse":[{"Rating":"Good"}],"count":1,"pagination":{"PageIndex":1}} 

me parece que funciona bien para mí. Actualmente estoy usando Json.net 4.5 r11

Si usted es objeto serializado cuando la estructura de clases parece

[Serializable] 
public class MoviesListRootObject 
{ 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
     public List<Response> response { get; set; } 
} 

Y la cadena JSON se parece a continuación

{"count":1,"pagination":{"PageIndex":1},"response":[{"Rating":"Good"}]} 

Y ahora estás utilizando la nueva estructura para deserializar, obtendrá nulo movieResponse ya que la propiedad se cambia en la nueva estructura.

Para resolver este problema, cree un nuevo jsonConverter personalizado derivado de JsonConverter y cree su objeto programáticamente. Por favor, eche un vistazo al enlace json-deserialization-with-jsonnet-class para tener una idea. En caso de que ya lo sepa y el problema persista, actualice la pregunta con más detalles, como la versión de Json.net utilizada, la cadena json, la estructura de clases completa, etc.

HTH.

4

Es bastante simple y fuera de la caja de soporte proporcionado por json.net, sólo hay que utilizar los siguientes JsonSettings al serializar y deserializar:

JsonConvert.SerializeObject(graph, Formatting.None, new JsonSerializerSettings() { 
    TypeNameHandling = TypeNameHandling.All, 
    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple 
}); 

y para Deserializing usar el siguiente código:

JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bData), type, 
    new JsonSerializerSettings() { 
    TypeNameHandling = TypeNameHandling.All 
}); 

Simplemente tome nota del inicializador de objetos JsonSerializerSettings, que es importante para usted.

Cuestiones relacionadas