DateTime类型数据格式问题

问题

在使用ASP.NET MVC 在写项目的时候发现,返回给前端的JSON数据,日期类型是 Date(121454578784541) 的格式,需要前端来转换一下才能用来使用。

C#对象属性名称转换成JSON自动转成“驼峰命名法”

问题

在C#中推荐的属性命名方式是“帕斯卡命名法”【首字母大写】但是在前端推荐命名方式为“驼峰命名法”【首字母小写】,这样如果直接序列化C#对象,返回的属性就是大写的了

MVC 默认的返回JsonResult在序列化有循环引用对象时候会出现异常

问题

序列化类型为“XXXXXX.XXXX.XXX”的对象时检测到循环引用。

解决办法

创建新的 JsonResult 对象

使用新的JSON序列化组件 Newtonsoft.Json

Install-Package Newtonsoft.Json

创建新的 JsonResult 对象
然后在新的 JsonResult 类型中将处理JSON序列化的对象改为 Newtonsoft.Json
并设置JSON转换的日期格式为 yyyy-MM-dd HH:mm:ss 例如:【2020-03-28 17:36:23】
并设置 转换的属性为“驼峰命名法”

/// <summary>
/// JSON结果返回对象
/// </summary>
public class JsonNetResult : JsonResult
{
/// <summary>
/// 实例化JSON结果返回对象
/// </summary>
/// <param name="data">需要序列化的对象</param>
/// <returns>JSON结果对象</returns>
public JsonNetResult(object data)
: this(data, JsonRequestBehavior.DenyGet)
{
} /// <summary>
/// 实例化JSON结果返回对象
/// </summary>
/// <param name="data">需要序列化的对象</param>
/// <param name="jsonRequestBehavior">设置是否允许GET请求获取JSON结果对象</param>
/// <returns>JSON结果对象</returns>
public JsonNetResult(object data, JsonRequestBehavior jsonRequestBehavior)
{
this.Data = data;
this.JsonRequestBehavior = jsonRequestBehavior;
this.Settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore, //忽略循环引用
DateFormatString = "yyyy-MM-dd HH:mm:ss", //输出的日期格式
ContractResolver = new CamelCasePropertyNamesContractResolver() //设置属性的名称为“驼峰命名法”
};
} /// <summary>
/// JSON序列化设置对象
/// </summary>
public JsonSerializerSettings Settings { get; set; } /// <summary>
/// 向响应流返回结果方法
/// </summary>
public override void ExecuteResult(ControllerContext context)
{
//判断当前请求是否为GET且判断是否允许GET获取JSON,不允许就报错
if ("GET".Equals(context.HttpContext.Request.HttpMethod, StringComparison.OrdinalIgnoreCase) &&
this.JsonRequestBehavior == JsonRequestBehavior.DenyGet)
throw new Exception("不允许GET请求返回JSON数据!"); //判断是否改变响应数据编码
if (this.ContentEncoding != null)
context.HttpContext.Response.ContentEncoding = this.ContentEncoding;
//如果当前需要序列化的数据为NULL就直接返回
if (this.Data == null)
return;
//设置响应数据内容格式为 json
context.HttpContext.Response.ContentType =
string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
//向响应流写入序列化的数据
JsonSerializer.Create(Settings).Serialize(context.HttpContext.Response.Output, this.Data);
}
}

使用新的 JsonResult 对象 方法一(推荐)

使用过滤器,将JsonResult对象替换成 JsonNetResult 对象

创建一个ActionFilter,用来将返回的JsonResult对象转换成新的JsonNetResult对象

/// <summary>
/// 将Action返回的JsonResult转换成JsonNetAction
/// </summary>
public class JsonNetActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
} public void OnActionExecuted(ActionExecutedContext filterContext)
{
//判断是JsonResult对象
if (filterContext.Result is JsonResult && !(filterContext.Result is JsonNetResult))
{
//得到原JsonResult对象
var jsonResult = (JsonResult) filterContext.Result;
//创建新的JsonNetResult对象
var jsonNetResult = new JsonNetResult(jsonResult.Data)
{
ContentEncoding = jsonResult.ContentEncoding,
ContentType = jsonResult.ContentType,
JsonRequestBehavior = jsonResult.JsonRequestBehavior,
MaxJsonLength = jsonResult.MaxJsonLength,
RecursionLimit = jsonResult.RecursionLimit
};
//将新的JsonNetResult对象赋值给返回结果
filterContext.Result = jsonNetResult;
}
}
}

在Global.asax注册过滤器

public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); //注册过滤器
GlobalFilters.Filters.Add(new JsonNetActionFilter());
}
}

使用

public class HomeController : Controller
{
public ActionResult GetStudent()
{
var student = new StudentDto
{
Id = ,
Name = "张三",
Age = ,
ClassName = "B36",
CreateDate = DateTime.Now,
};
return Json(student);
}
}

返回给前端的JSON数据

{"id":1,"name":"张三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}

使用新的 JsonResult 对象 方法二

创建一个BaseController 来重写他的Json()方法

创建一个 BaseController 类 继承自 Controller 类
并重写他的 Json() 方法,其他Controller 类都继承自 BaseController
这样 可以直接沿用之前的 返回Json对象方法

/// <summary>
/// 父 控制器
/// </summary>
public class BaseController : Controller
{
/// <summary>
/// 返回 JsonNetResult 对象
/// </summary>
/// <param name="data">需要返回序列化的对象</param>
/// <param name="contentType">内容格式</param>
/// <param name="contentEncoding">内容编码</param>
/// <param name="behavior">指定是否允许来自客户端的 HTTP GET 请求。</param>
/// <returns>JsonResult对象</returns>
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonNetResult(data)
{
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}

使用

public class HomeController : BaseController
{
public ActionResult GetStudent()
{
var student = new StudentDto
{
Id = ,
Name = "张三",
Age = ,
ClassName = "B36",
CreateDate = DateTime.Now,
};
//将当前对象序列化成JSON返回给前端
return Json(student);
}
}

返回给前端的JSON数据

{"id":1,"name":"张三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}

使用新的 JsonResult 对象 方法三

创建一个JSON帮助类

/// <summary>
/// JSON帮助类
/// </summary>
public static class JsonHelper
{
/// <summary>
/// 将一个对象序列化成JSON格式字符串返回给请求方
/// </summary>
/// <param name="obj">需要序列化的对象</param>
/// <param name="jsonRequestBehavior">设置是否允许GET请求获取JSON结果对象</param>
/// <returns>JSON结果对象</returns>
public static JsonNetResult Json(object obj,
JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
{
return new JsonNetResult(obj, jsonRequestBehavior);
} /// <summary>
/// 将当前对象序列化成JSON格式字符串返回给请求方
/// </summary>
/// <param name="obj">需要序列化的对象</param>
/// <param name="jsonRequestBehavior">设置是否允许GET请求获取JSON结果对象</param>
/// <returns>JSON结果对象</returns>
public static JsonNetResult ToJsonResult(this object obj,
JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
{
return new JsonNetResult(obj, jsonRequestBehavior);
}
}

使用

public ActionResult GetStudent()
{
var student = new StudentDto
{
Name = "张三",
Age = ,
ClassName = "B36",
CreateDate = DateTime.Now,
};
//直接调用扩展方法 ToJsonResult 来获取新的 JsonResult
return student.ToJsonResult();
}

返回给前端的JSON数据

{"id":1,"name":"张三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}

解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题的更多相关文章

  1. 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题

    问题背景: 在使用asp.net mvc 结合jquery esayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符 ...

  2. 用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题

    当用ajax异步时,返回JsonResult格式的时候,发现当字段是dateTime类型时,返回的json格式既然是“/Date(1435542121135)/” 这样子的,当然这不是我们想要的格式. ...

  3. mybatis会自动把字段名中的下划线转为驼峰命名法?

    先看一下转化的调用堆栈: 代码如下: 上面代码只是去掉了下划线,并没有首字母小写变大写的代码.再跟进findProperty方法可以找到获取驼峰结果的代码如下: 可以看出通过reflector.fin ...

  4. 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数

    [问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...

  5. 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds

    RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...

  6. 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录

    在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录 前言 最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1 ...

  7. Asp.net MVC 4新项目中创建area的后续操作

    Asp.net MVC 4新项目中创建area后,往往HomeController与area的HomeController路由发生混淆,需要手工设置一些地方避免mvc无法识别默认路由的状况. 无废话具 ...

  8. 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题

    解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...

  9. java和数据库中日期类型的常见用法

    (1)java中日期类型:Date.Timestamp(2)数据库中:Date.Timestamp(3)字符串和Date之间的格式化转换:    SimpleDateFormat类方法: format ...

随机推荐

  1. Spring配置cache(concurrentHashMap,guava cache、redis实现)附源码

    在应用程序中,数据一般是存在数据库中(磁盘介质),对于某些被频繁访问的数据,如果每次都访问数据库,不仅涉及到网络io,还受到数据库查询的影响:而目前通常会将频繁使用,并且不经常改变的数据放入缓存中,从 ...

  2. 一份简明的 Base64 原理解析

    书接上回,在 记一个 Base64 有关的 Bug 一文里,我们说到了 Base64 的编解码器有不同实现,交叉使用它们可能引发的问题等等. 这一回,我们来对 Base64 这一常用编解码技术的原理一 ...

  3. ubunto python + vnstat 限制每天流量使用 使用iptables

    上次想使用 iptables 转发80 端口,试了一段时间,没有成功.哪位知道是什么原因,还麻烦告诉我. 这次使用 iptables 禁用 80 443 出站,经过试验可以成功. 通过 iptable ...

  4. linux4.1.36 解决 SPI 时钟找不到 不生成设备 device

    最初的问题是 编译内核添加了 spi 支持,配置了 board 后,加载25q64驱动不执行probe 函数. 然后发现是,spi-s3c24xx.c 中的 probe 没有执行完就退出了 没有生成 ...

  5. 如何从普通程序员晋升为架构师 面向过程编程OP和面向编程OO

    引言 计算机科学是一门应用科学,它的知识体系是典型的倒三角结构,所用的基础知识并不多,只是随着应用领域和方向的不同,产生了很多的分支,所以说编程并不是一件很困难的事情,一个高中生经过特定的训练就可以做 ...

  6. Java自学路线图之Java系统自学

    Java自学不是一朝一夕的事情.可以采用"懒开始"的方法,但是必须要坚持下去,才能真正自学Java掌握编程技术.那些企图学几天去包装一下找工作的,请绕道.如果你下定决心自学Java ...

  7. ggplot2(4) 用图层构建图像

    4.1 简介 qplot()的局限性在于它只能使用一个数据集和一组图形属性映射,解决这个问题的办法就是使用图层.每个图层可以有自己的数据集和图形属性映射,附加的数据元素可通过图层添加到图形中. 一个图 ...

  8. kafka原理解析

    两张图读懂kafka应用: Kafka 中的术语 broker:中间的kafka cluster,存储消息,是由多个server组成的集群. topic:kafka给消息提供的分类方式.broker用 ...

  9. MQTT抓包分析

    1. 概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该 ...

  10. 如何简单的将手机投屏在windows上(可在电脑上直接操作手机)

    首先附上要使用的scrcpy源地址 接下来是如何使用(我用的是安卓手机+win10): 下载好后,首先使用数据线连接手机到电脑,并且手机需要打开开发人员选项(不知道如何打开的自行百度): 打开到安装s ...