13

[Serializable] 属性でマークされたいくつかの DTO を使用している ASP.NET WebApi (Release Candidate) プロジェクトに取り組んでいます。これらの DTO は私の管理外にあるため、変更することはできません。get メソッドからこれらのいずれかを返すと、結果の JSON には次のような一連の k__BackingFields が含まれます。

<Name>k__BackingField=Bobby
<DateCreated>k__BackingField=2012-06-19T12:35:18.6762652-05:00

私が行った検索に基づいて、これはJSON.NET の IgnoreSerializableAttribute 設定の問題のように思われ、私の問題を解決するには、記事が示唆するようにグローバルに設定する必要があります。ASP.NET Web API プロジェクトでこの設定をグローバルに変更するにはどうすればよいですか?

4

4 に答える 4

37

名前から k__BackingField を取り除く簡単な方法を見つけました。

このフラグメントは、Global.asax.cs の Application_Start() のどこかにあるはずです。

JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;

デフォルト設定がそれを処理するように見えます。

于 2012-07-10T20:33:24.140 に答える
2

ライブラリは の静的セッターを公開しないDefaultContractResolverため、静的ラッパーを作成し、JsonConvertSerialize*/Deserialize* メソッド (少なくとも使用するメソッド) を作成することをお勧めします。

静的ラッパーでは、静的コントラクト リゾルバーを定義できます。

private static readonly DefaultContractResolver Resolver = new DefaultContractResolver
{
    IgnoreSerializableAttribute = true
};

JsonSerializerSettingsこれは、ラッパー内の各シリアル化メソッドに渡すことができます。次に、プロジェクト全体でクラスを呼び出します。

別の方法として、JSON.NET ソース コードを取得し、デフォルトでその属性を使用するように自分で調整することもできます。

于 2012-06-20T18:20:03.353 に答える
-2

友よ、次のようなプロパティを宣言しないでください。

public String DiscretionCode { get; set; } 

しかし、昔のように補助変数を作成してください....

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}
于 2016-02-11T12:42:09.607 に答える