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

相关文章
相关标签/搜索