2012-02-21 36 views
25

Parece que debería ser tan fácil, pero obtengo una excepción cuando trato de deserialize usar un poco de JSON directo en un tipo administrado. La excepción es:No se definió ningún constructor sin parámetros para el tipo de 'System.String' durante la deserialización JSON

MissingMethodException
Sin constructor sin parámetros definidos para el tipo de 'System.String'

Si bien es cierto que no hay constructores sin parámetros para System.String, no estoy claro en cuanto a por qué esto importa.

El código que realiza la deserialización es:

using System.Web.Script.Serialization; 
private static JavaScriptSerializer serializer = new JavaScriptSerializer(); 
public static MyType Deserialize(string json) 
{ 
    return serializer.Deserialize<MyType>(json); 
} 

Mi tipo es más o menos:

public class MyType 
{ 
    public string id { get; set; } 
    public string type { get; set; } 
    public List<Double> location { get; set; } 
    public Address address { get; set; } 
    public Dictionary<string, string> localizedStrings { get; set; } 
} 

La otra clase es de una dirección:

public class Address 
{ 
    public string addressLine { get; set; } 
    public string suite { get; set; } 
    public string locality { get; set; } 
    public string subdivisionCode { get; set; } 
    public string postalCode { get; set; } 
    public string countryRegionCode { get; set; } 
    public string countryRegion { get; set; } 
} 

Aquí está la JSON:

{ 
    "id": "uniqueString", 
    "type": "Foo", 
    "location": [ 
     47.6, 
     -122.3321 
    ] 
    "address": { 
     "addressLine": "1000 Fourth Ave", 
     "suite": "en-us", 
     "locality": "Seattle", 
     "subdivisionCode": "WA", 
     "postalCode": "98104", 
     "countryRegionCode": "US", 
     "countryRegion": "United States" 
    }, 
    "localizedStrings": { 
     "en-us": "Library", 
     "en-ES": "La Biblioteca" 
    } 
} 

tengo la misma excepción, incluso si mi JSON es simplemente:

{ 
    "id": "uniquestring" 
} 

¿Puede alguien decirme por qué se necesita un constructor sin parámetros para System.String?

+0

La 'MissingMethodException' está asociada con el tipo' string' (no tiene un constructor sin parámetros), no con 'JavaScriptSerializer'. –

+0

Posible duplicado: http://stackoverflow.com/questions/2959605 –

+4

'DataContractJsonSerializer' es generalmente una mejor opción que' JavaScriptSerializer' de todos modos. – Steve

Respuesta

21

Los constructores sin paramétrica necesitan cualquier tipo de deserialización. Imagine que está implementando un deserializador. Es necesario:

  1. Consigue un tipo de objeto a partir de la corriente de entrada (en este caso, de cadena)
  2. Instantiate el objeto. No tiene forma de hacerlo si no hay un constructor predeterminado.
  3. leer las propiedades/valor de la corriente
  4. asignar los valores de la corriente al objeto creado en el paso 2.
+12

Oh, pero [hay una manera] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject.aspx) :) –

+0

@LucasTrzesniewski podría publicar esto como una respuesta ? – jrh

+0

@jrh mi comentario anterior se refiere al * "No tienes manera de hacer eso si no hay un constructor predeterminado" * parte de esta respuesta, pero no resuelve el problema de OP de ninguna manera. –

5

que tenía el mismo problema y esto fue lo que ha solucionado el problema.

¡Salud!

//Deserializing Json object from string 
DataContractJsonSerializer jsonObjectPersonInfo = 
    new DataContractJsonSerializer(typeof(PersonModel)); 
MemoryStream stream = 
    new MemoryStream(Encoding.UTF8.GetBytes(userInfo)); 
PersonModel personInfoModel = 
    (PersonModel)jsonObjectPersonInfo.ReadObject(stream); 
Cuestiones relacionadas