2009-11-23 15 views
6

La siguiente clase no se deserializa (pero sí se serializa) usando System.Web.Script.Serialization.JavaScriptSerializer.No se puede deserializar un KeyValuePair que se puede anular desde JSON con ASP.NET AJAX

public class foo { 
    public KeyValuePair<string, string>? bar {get;set;} 
} 

El intento de deserializar los resultados en un System.NullReferenceException cuando System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject llega a la propiedad bar. (Tenga en cuenta que es una suposición basada en el seguimiento de la pila).

Al cambiar el tipo de propiedad a KeyValuePair<string,string> se soluciona el problema, pero me gustaría conservar el tipo Nullable si es posible.

El JSON es exactamente lo que cabría esperar:

{"foo": { 
    "bar": { 
    "Key":"Jean-Luc", 
    "Value":"Picard" 
    } 
}} 

Ayuda?

+0

La deserialización para KeyValuePair no soluciona el error anterior, pero en realidad da como resultado dos cadenas vacías para el par. es decir, la deserialización da como resultado la pérdida de datos. ¡Así que el JSON anterior se convierte en un KeyValuePair de [,]! – Noel

Respuesta

4

La razón por la que esto sucede es que cuando JavaScriptSerializer intenta deserializar, crea una nueva instancia de la clase (en este, KeyValuePair) y luego asigna los valores a las propiedades.

Esto causa un problema ya que KeyValuePair solo puede tener la clave y los valores asignados como parte del constructor y no a través de las propiedades, por lo que genera una clave vacía y un valor.

Usted será capaz de resolver este problema y la nula mediante la creación de una clase que implementa JavaScriptConverter y Registering It. He utilizado el siguiente código para manejar un KeyValuePair estándar, pero estoy seguro de que puede extenderlo para manejar nulls.

Alternativamente, puede crear una clase simple que tenga dos propiedades clave y valor.

+0

Gracias por la respuesta. He estado luchando con este tema durante bastante tiempo y no pude entender por qué funcionaría casi cualquier otro tipo de datos, pero no un KeyValuePair. De nuevo, gracias, fue una respuesta directa y muy útil. – PetrolMan

+1

Me pregunto, en el contexto de MVC 3: ¿Hay alguna manera de registrar este convertidor para que todos los enlaces de modelo JSON tengan acceso a este convertidor? Registrar el convertidor con una instancia específica de JavaScriptSerializer no encaja muy bien con el enlace del modelo MVC 3. – kdawg

Cuestiones relacionadas