webapi返回json格式优化

一、设置webapi返回json格式

  在App_Start下的WebApiConfig的注册函数Register中添加下面这代码

config.Formatters.Remove(config.Formatters.XmlFormatter);

二、设置返回Json键值统一为小写

新建一个类并继承自DefaultContractResolver,重写ResolvePropertyName方法,

 public class UnderlineSplitContractResolver : DefaultContractResolver
 {
     protected override string ResolvePropertyName(string propertyName)
     {
         //return CamelCaseToUnderlineSplit(propertyName);
         return propertyName.ToLower();
     }
 }

在WebApiConfig.Register方法中添加配置代码

// 对 JSON 数据使用混合大小写。跟属性名同样的大小.输出
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new UnderlineSplitContractResolver();

三、在返回的JSON格式中出现两个很不开心的问题

看图:

第一个问题是为null的字符串,这里也返回了null,感觉返回""感觉好一点

第二个问题,lastupdate是时间格式,这种格式化看着有点不爽,如果是"2016-03-25 17:19:17"感觉就好点了

解决如下:

在解决第二个问题时我们新建的类UnderlineSplitContractResolver里面重写CreateProperties方法:

 //解决API NULL 和时间格式问题
 protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
 {
     return type.GetProperties           .Select(p =>
           {
               var jp = base.CreateProperty(p, memberSerialization);
               if (jp.PropertyType == typeof(System.String))
                   jp.ValueProvider = new NullToEmptyStringValueProvider(p);
               if (jp.PropertyType.ToString().Contains("System.DateTime"))
                   jp.Converter = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
               return jp;
           }).ToList();
}

NullToEmptyStringValueProvider类继承IValueProvider,代码如下:

    /// <summary>
    /// 解决返回json数据null问题
    /// </summary>
    public class NullToEmptyStringValueProvider : IValueProvider
    {
        PropertyInfo _MemberInfo;
        public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
        {
            _MemberInfo = memberInfo;
        }
        public object GetValue(object target)
        {
            object result = _MemberInfo.GetValue(target);
            //if (result == null)
            //    result = "";
            if (_MemberInfo.PropertyType == typeof(string) && result == null)
                result = "";
            return result;
        }
        public void SetValue(object target, object value)
        {
            _MemberInfo.SetValue(target, value);
        }
    }

此时问题已经解决,返回的json如下:

看起来是不是舒服多了?

四、整理一下代码

新建一个文件InitAPI.cs,代码如下:

  public class InitAPI
    {
        public static void Init(HttpConfiguration config)
        {
            //HttpConfiguration config = GlobalConfiguration.Configuration;
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            // 解决json序列化时的循环引用问题
            config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            // 对 JSON 数据使用混合大小写。驼峰式,但是是javascript 首字母小写形式.
            //config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new  CamelCasePropertyNamesContractResolver();
            // 对 JSON 数据使用混合大小写。跟属性名同样的大小.输出
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new UnderlineSplitContractResolver();
        }
    }

    public class UnderlineSplitContractResolver : DefaultContractResolver
    {

        protected override string ResolvePropertyName(string propertyName)
        {
            //return CamelCaseToUnderlineSplit(propertyName);
            return propertyName.ToLower();
        }
        private string CamelCaseToUnderlineSplit(string name)
        {
            return name.ToLower();
        }

        //解决API NULL 和时间格式问题
        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            return type.GetProperties()
                   .Select(p =>
                   {
                       var jp = base.CreateProperty(p, memberSerialization);
                       if (jp.PropertyType == typeof(System.String))
                           jp.ValueProvider = new NullToEmptyStringValueProvider(p);
                       if (jp.PropertyType.ToString().Contains("System.DateTime"))
                           jp.Converter = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
                       return jp;
                   }).ToList();
        }

    }
    /// <summary>
    /// 解决返回json数据null问题
    /// </summary>
    public class NullToEmptyStringValueProvider : IValueProvider
    {
        PropertyInfo _MemberInfo;
        public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
        {
            _MemberInfo = memberInfo;
        }
        public object GetValue(object target)
        {
            object result = _MemberInfo.GetValue(target);
            //if (result == null)
            //    result = "";
            if (_MemberInfo.PropertyType == typeof(string) && result == null)
                result = "";
            return result;
        }
        public void SetValue(object target, object value)
        {
            _MemberInfo.SetValue(target, value);
        }
    }

在WebApiConfig中直接调用InitAPI.Init(config),代码如下:

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{id}",
               defaults: new { id = RouteParameter.Optional }
           );

            InitAPI.Init(config);
        }
    }

结束

时间: 2024-10-10 14:03:39

webapi返回json格式优化的相关文章

如何让Asp.net webAPI返回JSON格式数据

ASP.NET Web API 是新一代的 HTTP 網路服務開發框架,除了可以透過 Visual Studio 2012 快速開發外 (內建於 ASP.NET MVC 4 的 Web API 專案範本內),也非常適合用於各種跨平台的行動裝置上,如果你想開發 RESTful 應用程式,那麼使用 ASP.NET Web API 應該是挺理想的解決方案.不過 ASP.NET Web API 內建支援 JSON 與 XML 兩種輸出格式,並依據瀏覽器端送出的 Accept 標頭自動決定回應的內容格式,

指定webapi 返回 json 格式 ; GlobalConfiguration.Configuration.Formatters.Clear()

因为 Internet Explorer 和 Firefox 发送了不同的 Accept 头,所以 web API 在响应里就发送了不同的内容类型.   解决方法,在 Global.asax的 Application_Start() 加入下面的代码 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();     参考 :http://blog.miniasp.com/post/2

如何让webapi只返回json格式数据

最近脑子不好用,总记不住事,以前搞过让webapi只返回json格式的数据,今天有人问我又突然想不起了,后来总结一下,备忘一下,大概有下面几种处理方式 1.在WebApiConfig类的Register方法增加一行代码,清除掉xmlformatter. config.Formatters.Remove(config.Formatters.XmlFormatter); 2.在Application_Start中加上一行代码,也可以实现 GlobalConfiguration.Configurati

WCF兼容WebAPI输出Json格式数据,从此WCF一举两得

问题起源: 很多时候为了业务层调用(后台代码),一些公共服务就独立成了WCF,使用起来非常方便,添加服务引用,然后简单配置就可以调用了. 如果这个时候Web站点页面需要调用怎么办呢? 复杂的XML , 使用不方便 ,而且通信成本也比较高. 这时候有人受不了了, 于是就新建了一套WebAPI , Web页面调用爽了.但是维护起来又麻烦了,一会儿WCF , 一会儿WebAPI 一段时间过后,可以想象已经相差甚远了. 某一天同事A , 在业务层需要调用一个接口 ,发现它是WebAPI方式的 ,被迫没办

使用getJSON()异步请求服务器返回json格式数据

我们可以使用jquery的getJSON()方法请求服务器返回json格式数据: js代码: function test(){ $.getJSON("JsonServlet",function(result){ alert(result.name); }); } 服务器端servlet响应: @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletEx

SpringMVC 统一返回JSON格式数据到前端

有时在给APP做接口功能的时候,都是返回JSON格式的数据,所以最好的只好在工程设置一个统一的数据返回方式 在SpringMVC 直接配置XML可以产生这种配置,比较简单 Spring的版本我用的是4.3.3的 <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter&qu

jquery ajax调用返回json格式数据处理

Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) var html = $.ajax({ url: "some.php", async: false }).responseText; 返回json数组取条数用result.length <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs"

ajax请求后台,返回json格式数据,模板!

添加一个用户的时候,需要找出公司下所有的部门,和相应部门下的角色,利用ajax请求,实现联动技术.将返回的json格式数据,添加到select标签下. <script type="text/javascript">        //加载出部门的信息            function loadGroup(){                            $.ajax({                    type:"post",  

struts+json 返回json格式多了斜杠的问题

功能要求 C#做http请求 ,后台 struts+json 返回json格式数据, 大概代码是这样的 后台java public String jo ; public String getNumpsQty(){ //*** JSONObject obj=new JSONObject(); JSONArray ja =JSONArray.fromObject(onv); obj.put("count", row); obj.put("root", ja); setJ