序列化日期转ISO格式后反序列化变回Microsoft格式问题求助
问题分析与解决方案
嘿,我仔细看了你的代码,终于找到问题所在啦!你现在遇到的日期格式回退问题,核心原因是多余的序列化/反序列化步骤 + ASP.NET MVC自带Json方法的默认序列化设置,咱们一步步拆解:
问题出在哪?
- 你先把查询到的
obj用Newtonsoft.Json序列化成了ISO格式的JSON字符串,这一步是对的。 - 但紧接着你又把这个JSON字符串反序列回了
List<SalesOrderHeader>对象,这一步完全没必要——你本来就有原始对象,绕这一圈根本没意义。 - 最关键的是:最后你用
Json(res, JsonRequestBehavior.AllowGet)返回结果时,ASP.NET MVC会用它自己默认的Json序列化器(默认采用Microsoft日期格式)再次对整个ResponseObject进行序列化,这直接覆盖了你之前设置的ISO格式!
两种解决方案
方案1:直接用Newtonsoft.Json序列化整个响应并返回ContentResult
跳过中间无意义的序列化/反序列化,直接把整个ResponseObject用你的ISO设置序列化,然后返回ContentResult,这样就能确保日期格式是你想要的ISO格式:
[HttpGet] public ActionResult GetHeaders(string id) { var obj = DBHelpers.ExecuteQuery<SalesOrderHeader>(string.Format("select * from sales_order_hdr where sales_order_id = '{0}'", id)); JsonSerializerSettings isoSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat }; ResponseObject res = new ResponseObject() { Code = "200", Data = obj }; // 直接序列化整个响应对象,返回JSON内容 string jsonResult = JsonConvert.SerializeObject(res, isoSettings); return Content(jsonResult, "application/json"); }
方案2:全局配置MVC的Json序列化设置(一劳永逸)
如果你的整个项目都需要用ISO日期格式,直接在全局配置里修改默认设置,这样所有JsonResult都会自动使用ISO格式,不用每次单独设置:
在Global.asax.cs的Application_Start方法中添加:
protected void Application_Start() { // 其他初始化代码... // 配置全局Json序列化采用ISO日期格式 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat; }
然后你的Get方法可以简化成这样:
[HttpGet] public ActionResult GetHeaders(string id) { var obj = DBHelpers.ExecuteQuery<SalesOrderHeader>(string.Format("select * from sales_order_hdr where sales_order_id = '{0}'", id)); ResponseObject res = new ResponseObject() { Code = "200", Data = obj }; // 现在返回Json时会自动用ISO日期格式 return Json(res, JsonRequestBehavior.AllowGet); }
额外提醒:SQL注入风险!
你的代码里用string.Format拼接SQL语句,这存在严重的SQL注入风险!建议改成参数化查询,比如:
// 假设DBHelpers支持参数化查询 var obj = DBHelpers.ExecuteQuery<SalesOrderHeader>( "select * from sales_order_hdr where sales_order_id = @id", new SqlParameter("@id", id) );
这样能有效防止恶意用户通过构造特殊ID来攻击你的数据库。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

