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


注:本文為個人學習摘錄,原文地址: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是完全不起作用的),所以它的使用范圍還是很有限的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM