けさらんぱさらん

方向性は定めず、ただ思いつくままに

ASP.NET Web APIでJSONをLowerCamelCaseで返す方法

この記事は、One ASP.NET Advent Calendar 2013の13日目の記事です。
前日は、xin9leさんのDynamicSignalRでした。


以前にASP.NET MVCでJSONのプロパティをLowerCaseで返す方法なんてのを書いたのですが
WebAPIだと簡単だって書いてその後なんにも触れてなかったのでこの機に書きたいと思います。

上記の記事でも書きましたがLowerCamelCaseにしたいのはJavaScriptで利用するときに
UpperCamelCaseのままだと気持ち悪いってのが理由です。

とりあえず準備

モデルクラスを適当に

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }
}

コントローラも適当に

public class UserController : ApiController
{
    public User Get(int id)
    {
        var user = new User { Id = 1, Name = "鈴木一朗" };

        return user;
    }
}

とりあえずこの状態で確認
f:id:cer1974:20131208221133p:plain:w150
当たり前ですがUpperCamelCase

返すJSONすべてをLowerCamelCaseにする

WebAPIでJSONをLowerCamelCaseにする方法は2通りあります(私がそれしか知らないって話ですが)
まずは、全体に設定する方法です。

Global.asaxにNewtonsoft.Json.Serialization名前空間をusingし
Application_Startメソッドに以下を追加します。

var config = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
config.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

これだけでOKです。
では結果を
f:id:cer1974:20131208222119p:plain:w150
ばっちりLowerCamelCaseになってます。

モデルクラス別に設定をする

モデルクラスのプロパティに属性を追加することにより
生成するJSONのプロパティ名を属性で設定した名前にします。

こんな感じ

[JsonProperty("id")]
public int Id { get; set; }

[JsonProperty("name")]
public string Name { get; set; }

Newtonsoft.Json名前空間をusingしてください。

結果は上と同じなので割愛します。
こちらは、LowerCamelCaseにする機能ではなく別名をつける機能ですね。
頭小文字にするも良しアンダーバー入れるも良し短縮するも良しって感じです。

まとめ

WebAPIの場合、すごく簡単にLowerCamelCaseにできます。
やっぱりJSON返すならこれからはWebAPIを使うべきですね。
ちなみにMVCAPIがこんなに違うのはJsonSerializerが異なるからです。

ただしこのAPIJavaScriptでしか使われないのであればこの方法で良いわけですが
WinFormだったりWindowsストアアプリからも呼び出される場合は頭小文字でも全然うれしくありません。
それにJavaScript側でちゃんとモデルオブジェクトを用意してマッピングしろって話もありますし
そんなに使うこともないのかなーって感じですね
せっかくのAdventCalendarなのにたいして役に立たない記事で申し訳ない!

明日はplusismさんです。よろしくお願いします。