ASP.NET Web APIは、オブジェクトのシリアル化にJson.NETをネイティブに使用することを理解していますが、使用するJsonSerializerSettings
オブジェクトを指定する方法はありますか?
たとえば、type
情報をシリアル化されたJSON文字列に含めたい場合はどうなりますか?通常、.Serialize()
呼び出しに設定を挿入しますが、Web APIはそれを静かに行います。設定を手動で挿入する方法が見つかりません。
JsonSerializerSettings
オブジェクトのFormatters.JsonFormatter.SerializerSettings
プロパティを使用して、HttpConfiguration
をカスタマイズできます。
たとえば、Application_Start()メソッドでそれを行うことができます。
protected void Application_Start()
{
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Formatting =
Newtonsoft.Json.Formatting.Indented;
}
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
答えは、この2行のコードをGlobal.asax.cs Application_Startメソッドに追加することです
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;
参照: 円形オブジェクト参照の処理