這個月瘋狂加班中,其實已經沒啥力氣寫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=.