2011-11-02 103 views
10

Estoy tratando de deserializar una respuesta json y estoy recibiendo el valor no puede ser un error nulo.Error de deserialización: el valor no puede ser nulo. Nombre del parámetro: tipo

¡Cualquier ayuda es realmente apreciada! Estoy deserializando muchas otras cadenas json de esta manera y nunca me he encontrado con este error. No estoy seguro de lo que lo está causando. ¡Gracias!

Este es el código para el objeto:

[Serializable] 
public class LocationResponse 
{ 
    public string authenticationResultCode { get; set; } 
    public string brandLogoUri { get; set; } 
    public string copyright { get; set; } 
    public List<ResourceSet> resourceSets { get; set; } 
    public int statusCode { get; set; } 
    public string statusDescription { get; set; } 
    public string traceId { get; set; } 
} 

[Serializable] 
public class ResourceSet 
{ 
    public int estimatedTotal { get; set; } 
    public List<Resource> resources { get; set; } 
} 

[Serializable] 
public class Resource 
{ 
    //public string __type { get; set; } 
    //public List<double> bbox { get; set; } 
    public string name { get; set; } 
    public Point point { get; set; } 
    //public Address address { get; set; } 
    //public string confidence { get; set; } 
    //public string entityType { get; set; } 
} 

[Serializable] 
public class Point 
{ 
    public string type { get; set; } 
    public List<double> coordinates { get; set; } 
} 

[Serializable] 
public class Address 
{ 
    public string countryRegion { get; set; } 
    public string formattedAddress { get; set; } 
} 

El código deserializar:

System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer(); 
string json = "{\"authenticationResultCode\":\"ValidCredentials\",\"brandLogoUri\":\"http:\\/\\/dev.virtualearth.net\\/Branding\\/logo_powered_by.png\",\"copyright\":\"Copyright © 2011 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.\",\"resourceSets\":[{\"estimatedTotal\":1,\"resources\":[{\"__type\":\"Location:http:\\/\\/schemas.microsoft.com\\/search\\/local\\/ws\\/rest\\/v1\",\"bbox\":[33.177484847720336,35.531577579036423,33.235425613705445,35.623878963932327],\"name\":\"Qiryat Shemona, Israel\",\"point\":{\"type\":\"Point\",\"coordinates\":[33.206455230712891,35.577728271484375]},\"address\":{\"adminDistrict\":\"Northern\",\"countryRegion\":\"Israel\",\"formattedAddress\":\"Qiryat Shemona, Israel\",\"locality\":\"Qiryat Shemona\"},\"confidence\":\"High\",\"entityType\":\"PopulatedPlace\"}]}],\"statusCode\":200,\"statusDescription\":\"OK\",\"traceId\":\"NVM001351\"}"; 
LocationResponse response = ser.Deserialize<LocationResponse>(json); 

estoy recibiendo un error y no puedo averiguar qué parte del código o JSON está dando este error: Detalles de la Excepción: System.ArgumentNullException: El valor no puede ser nulo. Nombre Parámetro: Tipo de

Aquí está el seguimiento de la pila si eso es útil:

[ArgumentNullException: Value cannot be null. 
Parameter name: type] 
System.Activator.CreateInstance(Type type, Boolean nonPublic) +7468694 
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +406 
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71 
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147 
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer) +21 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +181 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32 depth) +119 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +210 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) +422 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +147 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32 depth) +119 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +210 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) +422 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) +147 
System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer) +51 
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) +37 
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input) +70 

Respuesta

15

El problema es con el campo __type en el JSON.

La lectura de la respuesta a la siguiente: Problem with deserializing JSON on datamember “__type” parece que cita: the "__type" field has a special meaning for DataContractJsonSerializer, denoting the type to which the object should be deserialized.

Extracción __type del JSON resuelva el problema.

Una opción, (si no tiene control sobre el JSON), acabo de probar esto con la biblioteca JSON.NET y funcionó como se esperaba, deserializando sin errores.

LocationResponse response = JsonConvert.DeserializeObject<LocationResponse>(json); 
+0

¡Excelente! Pasé mucho tiempo navegando por la web para encontrar esta solución – f0rza

0
  1. método inicia la excepción de System.Activator.CreateInstance (Tipo Tipo, bool), como se puede ver en rastro de pila
  2. Se lanza porque el deserializador pasa nulo como "tipo" al método que mencioné anteriormente.

Lo más probable es que ocurra porque el deserializador no puede encontrar el tipo adecuado para deserializar JSON. Intenta serializar la instancia de tu clase LocationResponse primero y compara el resultado con la cadena que intentas deserializar.

1

Esta es tarde, pero tenía el mismo problema y se resolvió mediante la adición de un constructor por defecto a la clase en cuestión y asegurarse de que los emisores de las propiedades de esa clase eran públicos. Esto resolvió mi problema (presente tanto con FastJson como con JSON.net).

Por si acaso alguien tiene un problema y las respuestas anteriores no las ayudan.

Cuestiones relacionadas