• mvc 使用json.net 替换JsonResult 默认序列化


    默认mvc json序列化 机制处理日期等字段时 格式并不是我们想要的格式

    我们可以使用json.net 覆盖mvc默认的序列化行为

     1 using System;
     2 using System.Collections.Generic;
     3 using System.IO;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 using System.Web;
     8 using System.Web.Mvc;
     9 using Newtonsoft.Json;
    10 
    11 namespace Ecomm.Common.Web.Result
    12 {
    13     /// <summary>
    14     /// 覆盖默认  JsonResult 中JavascriptSerializer 序列化json 改用 json.net 序列化对象。处理日期问题
    15     /// </summary>
    16     public class JsonNetResult : JsonResult
    17     {
    18         public JsonNetResult()
    19         {
    20             Settings = new JsonSerializerSettings
    21             {
    22                 ReferenceLoopHandling = ReferenceLoopHandling.Error
    23             };
    24         }
    25 
    26         public JsonSerializerSettings Settings { get; private set; }
    27 
    28         public override void ExecuteResult(ControllerContext context)
    29         {
    30             if (context == null)
    31                 throw new ArgumentNullException("context");
    32             if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
    33                 throw new InvalidOperationException("JSON GET is not allowed");
    34 
    35             HttpResponseBase response = context.HttpContext.Response;
    36             response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
    37 
    38             if (this.ContentEncoding != null)
    39                 response.ContentEncoding = this.ContentEncoding;
    40             if (this.Data == null)
    41                 return;
    42 
    43             var scriptSerializer = JsonSerializer.Create(this.Settings);
    44 
    45             using (var sw = new StringWriter())
    46             {
    47                 scriptSerializer.Serialize(sw, this.Data);
    48                 response.Write(sw.ToString());
    49             }
    50         }
    51     }
    52 }
    View Code

    可以在baseController中覆盖默认 序列化行为

     1 using System;
     2 using System.Collections.Generic;
     3 using System.IO;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Web;
     7 using System.Web.Mvc;
     8 using System.Data;
     9 using Newtonsoft.Json;
    10 
    11 namespace Ecomm.Mvc.Web.Controllers
    12 {
    13     public  class BaseController:Controller
    14     {
    15         //
    16         // GET: /Base/
    17         // 项目都继承 Base 以后可以在这里扩展统一方法
    18 
    19         /// <summary>
    20         /// 覆盖重载默认的 JsonResult 序列化json 逻辑 改用json.net 引擎序列化对象 
    21         /// 解决 日期格式等问题
    22         /// </summary>
    23         /// <param name="data"></param>
    24         /// <param name="contentType"></param>
    25         /// <param name="contentEncoding"></param>
    26         /// <param name="behavior"></param>
    27         /// <returns></returns>
    28         protected override JsonResult Json(object data, string contentType,
    29        Encoding contentEncoding, JsonRequestBehavior behavior)
    30         {
    31             return new JsonNetResult
    32             {
    33                 Data = data,
    34                 ContentType = contentType,
    35                 ContentEncoding = contentEncoding,
    36                 JsonRequestBehavior = behavior
    37             };
    38         }
    39         /// <summary>
    40         /// controller action 执行之前执行
    41         /// </summary>
    42         /// <param name="filterContext"></param>
    43         protected override void OnActionExecuting(ActionExecutingContext
    44            filterContext)
    45         {
    46            //todo 在默认action 被执行前可以做的事情...
    47 
    48         }
    49     }
    50 }
    View Code

    也可以在JsonResult 中手动调用

  • 相关阅读:
    pip安装报错 解决办法
    django admin 支持时间更改
    fiddler抓包工具
    session token两种登陆方式
    面向对象内置方法
    linux 命令
    flask
    celery
    mac添加redis 环境变量
    Django请求流程图
  • 原文地址:https://www.cnblogs.com/wilsonjw/p/3620750.html
Copyright © 2020-2023  润新知