web-dev-qa-db-fra.com

Aucun constructeur sans paramètre défini pour le type de 'System.String' pendant la désérialisation JSON

Cela semble être si facile, mais je reçois une exception lorsque j'essaie de désérialiser un JSON simple en un type géré. L'exception est:

MissingMethodException
Aucun constructeur sans paramètre défini pour le type de 'System.String'

S'il est vrai qu'il n'y a pas de constructeur sans paramètre pour System.String, je ne sais pas pourquoi cela est important.

Le code qui effectue la désérialisation est:

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

Mon type est à peu près:

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'autre classe est pour une adresse:

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

Voici le 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"
    }
}

Je reçois la même exception même si mon JSON est juste:

{
    "id": "uniquestring"
}

Quelqu'un peut-il me dire pourquoi un constructeur sans paramètre est nécessaire pour System.String?

27
Justin R.

Les constructeurs sans paramètres ont besoin de tout type de désérialisation. Imaginez que vous implémentez un désérialiseur. Tu dois:

  1. Récupère un type d'objet dans le flux d'entrée (dans ce cas, c'est une chaîne)
  2. Instancier l'objet. Vous n'avez aucun moyen de le faire s'il n'y a pas de constructeur par défaut .
  3. Lire les propriétés/valeur du flux
  4. Attribuez les valeurs du flux à l'objet créé à l'étape 2.
22
Sergey Sirotkin

J'ai eu le même problème et c'est ce qui a résolu le problème.

À votre santé!

//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);
6
Amer Diglisic