You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

序列化日期转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 08:52:43