ASP.NET MVC WebApi 返回數據類型序列化控制(json,xml)

咱們都知道在使用WebApi的時候Controller會自動將Action的返回值自動進行各類序列化處理(序列化爲json,xml等),可是若是Controller的自動序列化後的結果不是咱們想要的該怎麼辦呢?其實在MVC中有一個GlobalConfiguration(命名空間System.Web.Http)類能夠設置WebApi的Controller自動序列化機制,這裏咱們就經過WebApi的Controller自動序列化json來說解怎麼設置序列化json的機制。html

 

首先咱們來看一個例子,下面是一個普通的WebApi的Controller及其中一個Actionjson

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方法中加入以下代碼:post

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類中屬性的設置值。spa

 

仔細看看GlobalConfiguration類咱們會發現,GlobalConfiguration.Configuration.Formatters就是序列化Action返回值的各類序列化模板,其中GlobalConfiguration.Configuration.Formatters.JsonFormatter就是序列化json的模板,GlobalConfiguration.Configuration.Formatters.XmlFormatter就是序列化xml的模板,固然你也能夠將自定義模板(模板類要繼承MediaTypeFormatter)加入到GlobalConfiguration.Configuration.Formatters中,實現將WebApi Controller的Action返回值序列化爲本身想要的任何格式。code

 

咱們還能夠發現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轉換器。orm

若是不明白TypeNameHandling.All是什麼請點擊本連接xml

 

說了這麼多其實就想說明一點經過GlobalConfiguration類是能夠控制WebApi Controller中Action返回值的序列化機制的,可是請注意到目前爲止GlobalConfiguration類只能控制WebApi Controller中Action返回值的序列化機制,它不能控制WebApi Controller中Action參數的反序列化機制,更不能控制MVC Controller的Action序列化機制(經測試MVC Controller的Action參數和返回值的序列化機制都沒法由GlobalConfiguration類來控制,GlobalConfiguration類的設置對於MVC Controller是徹底不起做用的),因此它的使用範圍仍是頗有限的。htm

相關文章
相關標籤/搜索