2014年5月15日

ASP.NET MVC - 限制CamalCase在特定的Web API Controller下

這個月瘋狂加班中,其實已經沒啥力氣寫Blog了,但今天和好友神人Bruce討論到這個問題,感覺不順手記一下,就太對不起Bruce今天的討論了,所以這篇就獻給Bruce吧XDD。

這個問題的情境大致上是這樣的,大家都知道Web API會透過JSON.NET來將物件序列化成JSON,而我們定義的C#物件,裡面的屬性名稱第一個字慣例上都會用大寫…但在JavaScript上,習慣第一個字為小寫…所以龜毛的小弟我,就會在WebApiConfig.cs或是Global.asax裡面去加上這串。(最底下的參考網址有官方連結 )

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

簡單的說,這段程式碼會告訴JSON.NET,若序列化的話,要把你讀到的C#物件裡面的屬性名稱的第一個單字,轉到JSON的時候,變成小寫喔…

就如同 Name會變成name,UserOrder會變成userOrder.

但現實上,一定不會那麼順利;如果是新的一個Case,那可以一開始的時候就可以這樣制定下來;但實際上,我相信有很多人是在舊的系統上運作,那加了上面的Code就會天下大亂了…

原因很簡單,那是因為GlobalConfiguration嘛…一套用,就全域都套了…

所以在真實環境中,比較好的做法,就是寫個attribute,來給Controller掛上,只要有掛的Controller都會自動轉第一個字母小寫,沒掛的就維持原本的大寫;這樣也大大的提升了彈性。

那怎麼做呢?.就是下面這段程式碼啦!~內容也滿簡單的,反正就是找出舊的,移除後,在放上新的規則~~ ( 感謝Bruce補充,這邊不要用add.要改用insert,不然會擾亂JSON和XML返回的優先順序~ 詳細內容可以參考底下相關連結,有Bruce針對此撰寫的文章~)

public class CamelCasedJsonAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
    {
        var formatter = controllerSettings.Formatters.JsonFormatter;
        controllerSettings.Formatters.Remove(formatter);

        formatter = new JsonMediaTypeFormatter
        {
            SerializerSettings = { ContractResolver = new CamelCasePropertyNamesContractResolver() }
        };

        controllerSettings.Formatters.Insert(0,formatter);

    }
}

而Controller怎樣使用呢??只要掛上就好,簡單又有力!!

[CamelCasedJson]
public class HoneController : ApiController

這樣子後,就可以順利的解決了現實生活上的問題了!!~

後記

另外,也可以從Model的地方加上Attribute,來告訴Json.NET序列化後,要變成怎樣的Json屬性名稱,這也是一種方式;但是當然,懶惰的小弟,還是使用以上的方法吧=v=.

參考網址

1 則留言: