xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

ASP.NET MVC 6でCamel CaseなJSONを出力する

半月ほど前になりますが 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 を参考にしたフレームワークであることを思い出し、閃きます。

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 も汚れません :)