2012-02-21 12 views
25

Sembra che dovrebbe essere così semplice, ma sto ricevendo un'eccezione quando provo a deserialize un semplice JSON in un tipo gestito. L'eccezione è:Nessun costruttore parametrico definito per tipo di "System.String" durante la deserializzazione JSON

MissingMethodException
No senza parametri costruttore definito per tipo di 'System.String'

Se è vero che non ci sono costruttori senza parametri per System.String, io non sono chiaro perché questo è importante.

Il codice che esegue la deserializzazione è:

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

mio tipo è più o meno:

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

L'altra classe è per un indirizzo:

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

Ecco il 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" 
    } 
} 

ottengo la stessa eccezione, anche se il mio JSON è solo:

{ 
    "id": "uniquestring" 
} 

Qualcuno può dirmi il motivo per cui è necessario un costruttore senza parametri per System.String?

+0

Il 'MissingMethodException' è associato al tipo' stringa' (non ha un costruttore senza parametri), non con 'JavaScriptSerializer'. –

+0

Possibile duplicato: http://stackoverflow.com/questions/2959605 –

+4

'DataContractJsonSerializer' è generalmente un'opzione migliore di' JavaScriptSerializer' comunque. – Steve

risposta

21

I costruttori senza parametri necessitano di qualsiasi tipo di deserializzazione. Immagina di implementare un deserializzatore. È necessario:

  1. Prendi un tipo di oggetto dal flusso di input (in questo caso di stringa)
  2. un'istanza di l'oggetto. Non è possibile farlo se non esiste un costruttore predefinito.
  3. leggere le proprietà/valore dal flusso
  4. assegnare i valori dal flusso per l'oggetto creato nel passaggio 2.
+12

Oh ma [c'è un modo] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject.aspx) :) –

+0

@LucasTrzesniewski potresti postare questo come risposta ? – jrh

+0

@jrh il mio commento sopra si riferisce al * "Non c'è modo di farlo se non esiste un costruttore predefinito" * parte di questa risposta, ma non risolve il problema dell'OP in alcun modo. –

5

Ho avuto lo stesso problema e questo era ciò che risolto il problema.

Cheers!

//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); 
Problemi correlati