半月ほど前になりますが Visual Studio 2015 が正式にリリースされました。コードページの問題などいろいろありますが、本当にたくさんの機能追加や機能改善があります。そんな機能たちの中でも最近は特に ASP.NET 5 / MVC 6 に関心があって、サンプルとして Web API などを作りつつ触っています。
今回は、そんなこんな触っていた中で知ったことをひとつ。
戻り値の JSON が PascalCase
「Web API から返すデータは JSON!」というのが最近の主流であることは周知の通りです。ASP.NET Web API 2.x は流石専用のフレームワークとあって返す JSON は自動で CamelCase になりますが、ASP.NET MVC 5.x で実装すると PascalCase で返されます。CamelCase にするためには以下のような対応が必要でした。
一度書けば終わりかもしれないですが、やはりめんどくさかった。では気になる「ASP.NET MVC 6 はどうなのか?」と言うと...
public class JsonController : Controller { [HttpGet] public IActionResult Sample() { return this.Json(new { Name = "xin9le", Age = 30 }); } } //--- 出力結果 // { Name: "xin9le", Age: 30 }
やっぱり PascalCase な JSON が返されるわけです。MVC と Web API が統合されたということで期待していたのに!裏切られた!(ぇ
もちろん先の 5.x 系と同じ対応でも解決できるのですが、ASP.NET 5 が OWIN を参考にしたフレームワークであることを思い出し、閃きます。
ASP,NET Web APIも取り込んだなら標準でcamel case jsonにしてほしい。とはいえ、Controllerよりも前のレイヤーのどこかに差し込む方法があるのではないかとは思うけれど。
— じんぐる (@xin9le) 2015, 7月 19
MVC のオプション設定を変える
オープンソース万歳ということで ASP.NET MVC のソースコードを GitHub からクローンし、それっぽい設定がないかを探して回ってみました。そしたらやっぱりあるんですね。ASP.NET MVC 6 系では Startup.cs
内で以下のように対応するのが良さそうです。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); //--- JSONのシリアライズ設定を変更 //--- このメソッドは1度しか呼び出されません //--- MVC 6 beta 6 以降で有効 services.ConfigureMvcJson(options => { options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); options.SerializerSettings.Converters = new List<JsonConverter>{ new StringEnumConverter() }; }); /* //--- MVC 6 beta 5 まではこっち services.ConfigureMvc(options => { options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); options.SerializerSettings.Converters = new List<JsonConverter>{ new StringEnumConverter() }; }); */ }
これならとてもお手軽ですし、Controller も汚れません :)