web-dev-qa-db-ja.com

MVC 4 Web APIでJson.NETのカスタムJsonSerializerSettingsを設定する方法は?

ASP.NET Web APIは、オブジェクトのシリアル化にJson.NETをネイティブに使用することを理解していますが、使用するJsonSerializerSettingsオブジェクトを指定する方法はありますか?

たとえば、type情報をシリアル化されたJSON文字列に含めたい場合はどうなりますか?通常、.Serialize()呼び出しに設定を挿入しますが、Web APIはそれを静かに行います。設定を手動で挿入する方法が見つかりません。

67

JsonSerializerSettingsオブジェクトのFormatters.JsonFormatter.SerializerSettingsプロパティを使用して、HttpConfigurationをカスタマイズできます。

たとえば、Application_Start()メソッドでそれを行うことができます。

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.Formatting =
        Newtonsoft.Json.Formatting.Indented;
}
106
carlosfigueira

JsonSerializerSettingsごとにJsonConvertを指定でき、グローバルなデフォルトを設定できます。

単一のJsonConvertとオーバーロード:

// Option #1.
JsonSerializerSettings config = new JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore };
this.json = JsonConvert.SerializeObject(YourObject, Formatting.Indented, config);

// Option #2 (inline).
JsonConvert.SerializeObject(YourObject, Formatting.Indented,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    }
);

Global.asax.csのApplication_Start()のコードによるグローバル設定

JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
     Formatting = Newtonsoft.Json.Formatting.Indented,
     ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};

リファレンス: https://github.com/JamesNK/Newtonsoft.Json/issues/78

36
smockle

答えは、この2行のコードをGlobal.asax.cs Application_Startメソッドに追加することです

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.All;

参照: 円形オブジェクト参照の処理

2
AEMLoviji