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 MVC 数据传递
ASP.NET MVC 5、ASP.NET Core MVC 5 有啥区别?