ASP.NET MVC Controller.Json DateTime 序列化与 NewtonSoft Json DateTime 序列化

Posted

技术标签:

【中文标题】ASP.NET MVC Controller.Json DateTime 序列化与 NewtonSoft Json DateTime 序列化【英文标题】:ASP.NET MVC Controller.Json DateTime Serialization vs NewtonSoft Json DateTime Serialization 【发布时间】:2012-05-18 14:41:53 【问题描述】:

当我使用返回包含 DateTime 属性的对象时

return Json(value);

在我收到的客户端上

"/Date(1336618438854)/"

如果我使用

返回相同的值
return Json(JsonConvert.SerializeObject(value));

那么返回的序列化值(连同序列化对象)是时区感知的:

"/Date(1336618438854-0400)/"

有什么方法可以在不进行双重序列化的情况下获得一致的 DateTime 结果?我在某处读到 MS 会将 Newtonsoft JSON 包含到 MVC 中?

【问题讨论】:

嗯谷歌?这听起来很熟悉。牛顿的序列化工作正常。问题是为什么 MVC 在采用 /Date()/ 格式时会忽略时区。 只需使用$.parseJSON(result) 即可正确解析日期。 ***.com/a/4540007/752974 【参考方案1】:

我终于知道该怎么做了。 我会将我的项目切换到 ISO 8601 DateTime 格式。 JSON.net 可以很好地完成序列化,只需使用 JsonConverter 属性装饰对象上的 datetime 属性即可。

    public class ComplexObject 
    
        [JsonProperty]
        public string ModifiedBy  get; set; 
        [JsonProperty]
        [JsonConverter(typeof(IsoDateTimeConverter))]
        public DateTime Modified  get; set; 
        ...
     

要将序列化对象返回给客户端 ajax 调用,我可以这样做:

    return Json(JsonConvert.SerializeObject(complexObjectInstance));

在客户端:

    jsObject = JSON.parse(result)

现在我认为将默认的 ASP.NET MVC 默认 JSON 序列化程序覆盖为我们 Newtonsoft JSON.net ISO 8601 序列化可能很简单,是的,原理应该类似于这个线程:Change Default JSON Serializer Used In ASP MVC3。

【讨论】:

很好的答案,但我发现 Newtonsoft.Json 属性不是必需的。只需使用$.parseJSON(result) 即可正确解析日期。 ***.com/a/4540007/752974【参考方案2】:

WebApiConfig 集合中:

config.Formatters.Remove(config.Formatters.XmlFormatter);
        //config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
        config.Formatters.JsonFormatter.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;

        config.MapHttpAttributeRoutes();

在 ApiController 中返回这个:

return Request.CreateResponse(HttpStatusCode.OK, obj);

祝你好运 卡胡马达

【讨论】:

【参考方案3】:

如果您不想深入研究解析问题,而不仅仅是将日期转换为字符串而不是使用 JSON 解析它。

例如

return Json(DateTime.Now.ToString("your date format if you want to specify"));

【讨论】:

抱歉,这篇文章不是关于显示日期的。它是关于在服务器到客户端和客户端到服务器场景中包含 DateTime 属性的复杂对象的序列化日期格式的一致性。你建议我在第二行用 SerializeObject 对整个对象做些什么。 @user1188755 ...在下面查看***.com/questions/668488/…【参考方案4】:

它返回服务器日期格式。您需要定义自己的函数。

function jsonDateFormat(jsonDate) 

// Changed data format;
return (new Date(parseInt(jsonDate.substr(6)))).format("mm-dd-yyyy / h:MM tt");

;

【讨论】:

以上是关于ASP.NET MVC Controller.Json DateTime 序列化与 NewtonSoft Json DateTime 序列化的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net mvc和asp.net有啥区别?

七天学会ASP.NET MVC ——ASP.NET MVC 数据传递

ASP.NET MVC

ASP.NET MVC 5、ASP.NET Core MVC 5 有啥区别?

ASP.NET MVC 和 Angularjs 与 ASP.NET MVC 和 Reactjs

七天学会ASP.NET MVC ——ASP.Net MVC 数据处理