web-dev-qa-db-ja.com

デフォルトのグローバルJSONシリアライザー設定を設定する

global.asaxでこのようなグローバルシリアライザー設定を設定しようとしています。

var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
formatter.SerializerSettings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    TypeNameHandling = TypeNameHandling.Objects,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

次のコードを使用してオブジェクトをシリアル化する場合、グローバルシリアライザー設定は使用されませんか?

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StringContent(JsonConvert.SerializeObject(page))
};

このようなグローバルシリアライザー設定を設定することはできませんか、何か不足していますか?

32
Marcus

JsonConvert.DefaultSettingsトリックをしました。

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    TypeNameHandling = TypeNameHandling.Objects,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
70
Marcus

受け入れられた答えは私にはうまくいきませんでした。 .netcoreで、私はそれを動作させました...

services.AddMvc(c =>
                 {
                 ....
                 }).AddJsonOptions(options => {
                     options.SerializerSettings.Formatting = Formatting.Indented;
                     ....
                 })
4
Michael

コンテンツでネゴシエートされた応答を返すことができ、フォーマッターの設定が有効になるように、アクションで次の操作を行うだけです。

return Request.CreateResponse(HttpStatusCode.OK, page);
2
Kiran Challa

シリアライザーを設定する場所については正しいです。ただし、要求されたコンテンツタイプのJSONを使用してサイトへの要求が行われる場合、そのシリアライザーが使用されます。 SerializeObjectを呼び出すときに使用される設定の一部ではありません。プロパティを介してglobal.asaxで定義されたJSONシリアル化設定を公開することで、この問題を回避できます。

public static JsonSerializerSettings JsonSerializerSettings
{
    get
    {
        return GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
    }
}

そして、このプロパティを使用して、コントローラー内でシリアル化を行うときにシリアル化設定を設定します。

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StringContent(JsonConvert.SerializeObject(page, WebApiApplication.JsonSerializerSettings))
};
1
Scott Corbett