No parameterless constructor defined for type of 'System.String' during JSON deserialization

匿名 (未验证) 提交于 2019-12-03 01:57:01

问题:

This seems like it should be so easy, but I am getting an exception when I try to deserialize some straightforward JSON into a managed type. The exception is:

MissingMethodException
No parameterless constructor defined for type of 'System.String'

While it is true that there are no parameterless constructors for System.String, I'm not clear as to why this matters.

The code that performs the deserialization is:

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

My type is roughly:

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

The other class is for an address:

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

Here's the 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"     } } 

I get the same exception even if my JSON is just:

{     "id": "uniquestring" } 

Can anybody tell me why a parameterless constructor is needed for System.String?

回答1:

Parameterless constructors need for any kind of deserialization. Imagine that you are implementing a deserializer. You need to:

  1. Get a type of object from the input stream (in this case it's string)
  2. Instantiate the object. You have no way to do that if there is no default constructor.
  3. Read the properties/value from stream
  4. Assign the values from the stream to the object created on step 2.


回答2:

I had the same issue and this was what fixed the issue.

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!