web-dev-qa-db-ja.com

JSONの逆シリアル化中に「System.String」のタイプに対して定義されたパラメーターなしのコンストラクターはありません

これはとても簡単に思えますが、マネージタイプに deserialize いくつかの簡単な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; }
}

もう1つのクラスは住所用です。

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にパラメーターなしのコンストラクターが必要な理由を教えてもらえますか?

27
Justin R.

パラメータなしのコンストラクタは、あらゆる種類の逆シリアル化を必要とします。デシリアライザーを実装していると想像してください。必要がある:

  1. 入力ストリームからオブジェクトのタイプを取得します(この場合は文字列です)
  2. インスタンス化オブジェクト。 デフォルトのコンストラクタがない場合、それを行う方法はありません
  3. ストリームからプロパティ/値を読み取ります
  4. ストリームの値を手順2で作成したオブジェクトに割り当てます。
22
Sergey Sirotkin

私は同じ問題を抱えていましたが、これが問題を解決したものです。

乾杯!

//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);
6
Amer Diglisic