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

    最后通过我写的一个例子来演示怎么自定义和使用Json.Net的转换器,这个例子还阐述了Json.Net在序列化和反序列化实现了接口IEnumerable的类时所遇到的问题,有兴趣的朋友可以下载。

    JsonNetArraySerialization.rar

  • 相关阅读:
    自定义 Repository 方法
    SpringData_JpaSpecificationExecutor接口
    SpringData_JpaRepository接口
    SpringData_PagingAndSortingRepository接口
    SpringData_CrudRepository接口
    SpringData修改和删除操作
    自定义查询语句SpringData
    SpringData关键字查询练习
    compile——生成ast
    vue-compile概述
  • 原文地址:https://www.cnblogs.com/sky-net/p/5955179.html
Copyright © 2020-2023  润新知