C# – No parameterless constructor defined for type of ‘System.String’ during JSON deserialization


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:

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

My type is roughly:

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

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": [
    "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?

Best Solution

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.
Related Question