在JSON反序列化期间,没有为’System.String’类型定义无参数构造函数

这看起来应该很容易,但是当我尝试将一些简单的JSON 反序列化为托管类型时,我会遇到exception。 例外是:

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(json); } 

我的类型大致是:

 public class MyType { public string id { get; set; } public string type { get; set; } public List location { get; set; } public Address address { get; set; } public Dictionary 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只是:我得到了相同的exception:

 { "id": "uniquestring" } 

谁能告诉我为什么System.String需要无参数构造函数?

无参数构造函数需要任何类型的反序列化。 想象一下,您正在实现一个反序列化器。 你需要:

  1. 从输入流中获取一种对象(在本例中为字符串)
  2. 实例化对象。 如果没有默认构造函数,则无法执行此操作
  3. 从流中读取属性/值
  4. 将流中的值分配给在步骤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);