Подтвердить что ты не робот

Нет конструктора без параметров, определенного для типа "System.String" во время десериализации JSON

Кажется, что это должно быть так просто, но я получаю исключение, когда я пытаюсь десериализовать некоторый простой 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?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ура!

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