Не определен конструктор без параметров для типа System.String во время десериализации JSON - PullRequest
27 голосов
/ 22 февраля 2012

Кажется, это должно быть так просто, но я получаю исключение, когда пытаюсь десериализовать некоторый простой JSON в управляемый тип.Исключением является:

MissingMethodException
Не определен конструктор без параметров для типа 'System.String'

Хотя верно, что для System нет конструкторов без параметров.String, мне не ясно, почему это важно.

Код, который выполняет десериализацию:

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

Мой тип примерно:

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

Другой класс предназначен для адреса:

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

Вот 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"
    }
}

Я получаю то же исключение, даже если мой JSON просто:

{
    "id": "uniquestring"
}

Кто-нибудь может мне сказать, почему для System.String нужен конструктор без параметров?

Ответы [ 2 ]

21 голосов
/ 22 февраля 2012

Конструкторы без параметров нужны для любого десериализации. Представьте, что вы внедряете десериализатор. Вам необходимо:

  1. Получить тип объекта из входного потока (в данном случае это строка)
  2. Создание экземпляра объекта. У вас нет способа сделать это, если нет конструктора по умолчанию .
  3. Считать свойства / значение из потока
  4. Назначьте значения из потока объекту, созданному на шаге 2.
6 голосов
/ 09 сентября 2014

У меня была та же проблема, и это было тем, что исправило проблему.

Приветствия!

//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);
...