注:本文為個人學習摘錄,原文地址:http://www.cnblogs.com/OpenCoder/p/4628557.html
我們都知道在使用WebApi的時候Controller會自動將Action的返回值自動進行各種序列化處理(序列化為json,xml等),但是如果Controller的自動序列化后的結果不是我們想要的該怎么辦呢?其實在MVC中有一個GlobalConfiguration(命名空間System.Web.Http)類可以設置WebApi的Controller自動序列化機制,這里我們就通過WebApi的Controller自動序列化json來講解怎么設置序列化json的機制。
首先我們來看一個例子,下面是一個普通的WebApi的Controller及其中一個Action
public class DataController : ApiController { [AcceptVerbs("get","post")] public People GetPeople() { People people = new People(); people.Name = "Jim"; people.Age = 28; people.Id = 12345; return people; } }
在WebApi Controller的默認序列化機制下,這段代碼最后會得到如下json文本:
{"Name":"Jim","Age":28,"Id":12345}
現在假設我們覺得上面得到的json文本有點不盡人意,因為我並不知道這段json是由什么C#類型序列化而來的,怎么辦呢?下面就該GlobalConfiguration類出場了,我們在MVC項目中的Global.asax文件的Application_Start方法中加入如下代碼:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All;
再次執行上面DataController的GetPeople方法,我們這次得到了如下json文本:
{"$type":"GlobalConfigurationDemoInMVC.Models.People, GlobalConfigurationDemoInMVC","Name":"Jim","Age":28,"Id":12345}
這次我們就可以從json文本的$type屬性知道這段json是從類GlobalConfigurationDemoInMVC.Models.People序列化而來的了。因此我們可以知道WebApi的Controller在做Action返回值的序列化時,使用的是GlobalConfiguration類中屬性的設置值。
仔細看看GlobalConfiguration類我們會發現,GlobalConfiguration.Configuration.Formatters就是序列化Action返回值的各種序列化模板,其中GlobalConfiguration.Configuration.Formatters.JsonFormatter就是序列化json的模板,GlobalConfiguration.Configuration.Formatters.XmlFormatter就是序列化xml的模板,當然你也可以將自定義模板(模板類要繼承MediaTypeFormatter)加入到GlobalConfiguration.Configuration.Formatters中,實現將WebApi Controller的Action返回值序列化為自己想要的任何格式。
我們還可以發現GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings這個屬性是Newtonsoft的Json.Net框架中的類型,說明WebApi是使用Json.Net框架來做Action返回值的json序列化的。所以只要我們將GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling設置為TypeNameHandling.All,就可以讓WebApi Controller在將Action的返回值序列化為json時加上序列化類型了。我們也可以通過GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters屬性來增加自定義json轉換器,從而讓WebApi Controller將Action返回值序列化為json時,使用我們自定義的json轉換器。
如果不明白TypeNameHandling.All是什么請點擊本鏈接
說了這么多其實就想說明一點通過GlobalConfiguration類是可以控制WebApi Controller中Action返回值的序列化機制的,但是請注意到目前為止GlobalConfiguration類只能控制WebApi Controller中Action返回值的序列化機制,它不能控制WebApi Controller中Action參數的反序列化機制,更不能控制MVC Controller的Action序列化機制(經測試MVC Controller的Action參數和返回值的序列化機制都無法由GlobalConfiguration類來控制,GlobalConfiguration類的設置對於MVC Controller是完全不起作用的),所以它的使用范圍還是很有限的。