zoukankan      html  css  js  c++  java
  • 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是完全不起作用的),所以它的使用范围还是很有限的。

  • 相关阅读:
    agc015D A or...or B Problem
    agc016E Poor Turkeys
    CTSC2016时空旅行
    假期的宿舍[ZJOI2009]
    上白泽慧音(luogu P1726
    小K的农场(luogu P1993
    Cashier Employment(poj1275
    Intervals(poj1201
    序列分割[Apio2014]
    特别行动队[APIO2010]
  • 原文地址:https://www.cnblogs.com/Herzog3/p/6230495.html
Copyright © 2011-2022 走看看