ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)

我们都知道在使用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是完全不起作用的),所以它的使用范围还是很有限的。

时间: 2024-10-17 00:11:23

ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)的相关文章

我使用Asp.net MVC WebAPI支持OData协议进行分页操作的笔记(第二篇)

在阅读这篇文章的时候,我想你已经看完第一篇文章啦·也有可能跟我一样,现在正在使用它Asp.net WebAPI为我们干活儿.可能是服务分页查询接口,也可能是其它操作,遇到了一些小问题.有问题,那咱就来解决问题吧!(码农万岁,万岁,万万岁!) 扯两句,Asp.net MVC WebAPI,是建立在Asp.net MVC基础上的.所有的请求处理,都遵循MVC的路由规则,对于请求的拦截与处理,都可以通过自定义继承自 System.Web.Http.Filters.ActionFilterAttribu

asp.net mvc 对象和集合序列化

private List<Model.Organization.Organization> GetOrganiztions(){var organizations = new List<Model.Organization.Organization>(); organizations.Add(new Model.Organization.Organization{Id = "1",Name = "一汽",}); organizations.A

让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关于ASP.NET MVC WebAPI 支持OData协议的文章,很受启发. 但是对于OData协议下对数据的分页查询,确实没有找到让我满意的东西,可能是个人就这脾气.不喜欢复杂. 对于在 WebAPI 支持OData协议,好处不多讲了,反正,我个人是非常乐意用它来做服务接口之类的. 这篇笔记的主题

.net异步性能测试(包括ASP.NET MVC WebAPI异步方法)

很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.Net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语言的异步性能测试(有关异步和同步的问题,请参考客<AIO与BIO接口性能对比>),于是我今天写了一个C#的测试程序. 首先,建一个 ASP.NET MVC WebAPI项目,在默认的控制器 values里面,增加两个方法: // GET api/values?sleepTime=10 [HttpG

案例:1 Ionic Framework+AngularJS+ASP.NET MVC WebApi Jsonp 移动开发

落叶的庭院扫的一干二净之后,还要轻轻把树摇一下,抖落几片叶子,这才是Wabi Sabi的境界. 介绍:Ionic是移动框架,angularjs这就不用说了,ASP.Net MVC WebApi提供数据源,开放数据接口 快乐学习 Ionic Framework+PhoneGap 手册1-1{创建APP项目}{点击查看} 快乐学习 Ionic Framework+PhoneGap 手册1-2{介绍Header,Content,Footer的使用}{点击查看} 快乐学习 Ionic Framework

【转载】C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte

C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte 转载:http://www.itdos.com/Mvc/20150302/0741255.html using System.IO; /// <summary> /// WebApi返回图片 /// </summary> public HttpResponseMessage GetQrCode() { var imgPath = @"D:\ITdosCom\Images

我使用Asp.net MVC WebAPI支持OData协议进行分页操作的笔记(第三篇)

第三篇笔记,这是自己 Asp.net MVC OData协议 分页解决方案的 最后一记啦.OK,let's go ! 第一件事儿! 第一件事儿,就是下载这个组件了,你可以通过下面提供的附件下载,当然也可以下载源码自己编译一个. 怎么使用它? 在你返回分页数据的Action上加(ODPageResultAttribute)就可以支持返回分页数据了,分页数据返回的格式为json,包含字段如第一篇笔记中提到的分页数据返回对象一致.具体的请参考项目源代码(ODataPQ.Tests\Controller

ASP.NET MVC WebAPI 资源整理

注:这是收集给公司同事学习的资料,入门级别的. 使用ASP.Net WebAPI构建REST服务(一)——简单的示例 http://blog.csdn.net/mengzhengjie/article/details/52397112 说明:有关WebAPI入门的文章,这是一个系列,对于了解WebAPI其它方面很有帮助. ASP.NET MVC学习之路由篇(1) http://www.cnblogs.com/yaozhenfa/p/asp_net_mvc_route_1.html 说明:有关 M

WebAPI返回数据类型解惑

原文:http://www.cnblogs.com/lzrabbit/archive/2013/03/19/2948522.html 最近开始使用WebAPI,上手很容易,然后有些疑惑 1.WebAPI默认返回什么数据类型,json还是xml? 2.怎么修改WebAPI的返回数据类型,我用IE浏览器请求返回的数据都是JSON格式的,用Firefox和Chrome返回数据格式是XML,然后自己用HttpWebRequest请求返回的是JSON格式的,我就纳闷了,咋同样的程序.同样的配置文件,输出数