9

わかりました-私はこれに対して数時間頭を悩ませてきました。助けを求める時です。

Web アプリケーション プロジェクトを ASP.NET MVC 4 RC と新しい WebApi にアップグレードしました。Web API メソッドが空の json "{}" を返すようになりました。

シリアライザーを、Newtonsoft Json シリアライザーも呼び出す独自の MediaTypeFormatter に置き換えたので、接続して動作を確認できます。私が見ているのは、オブジェクトがシリアライザーに入り、「{}」として出てくることです。

これは、アップグレードする前に機能していました。

これは私のオブジェクトです

[Serializable]
public class Parameters
{
    public string ApplicantName { get; set; }
}

そして、私はちょうど呼んでいます:

var result = JsonConvert.SerializeObject(new Parameters(){ Name = "test" });

私は戻ってきます

"{}"

どうしたの??

[編集]

他の誰かが同じ問題を抱えています... Newtonsoft のソース コードを実行した後、最近の変更によりまったく同じ問題が発生していることがわかりました。

http://json.codeplex.com/discussions/357850

4

1 に答える 1

5

わかりました - 多数の変更があり、その結果、Json 出力にかなり根本的な変更が加えられました。これらの変更には、カスタム TypeConverters の適用方法も含まれます。

(少なくとも私たちにとっては) Newtonsoft シリアライザーを基本的なシリアライズ可能オブジェクト シリアライザーのように動作させる基本的なリゾルバーを作成しました。つまり、すべてのプロパティをシリアル化し、カスタム TypeConverters を使用しません...

/// <summary>
/// A resolver that will serialize all properties, and ignore custom TypeConverter attributes.
/// </summary>
public class SerializableContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var properties = base.CreateProperties(type, memberSerialization);

        foreach (var p in properties)
            p.Ignored = false;

        return properties;
    }

    protected override Newtonsoft.Json.Serialization.JsonContract CreateContract(Type objectType)
    {
        var contract = base.CreateContract(objectType);

        if (contract is Newtonsoft.Json.Serialization.JsonStringContract)
            return CreateObjectContract(objectType);
        return contract;
    }
}

* 登録 * MvcApplication "Application_Start" で...

GlobalConfiguration.Configuration.Formatters
    .JsonFormatter.SerializerSettings.ContractResolver = 
        new SerializableContractResolver()
        {
            IgnoreSerializableAttribute = true
        };
于 2012-06-16T04:41:26.903 に答える