ASP.NET MVC控制器.Json DateTime序列化与NewtonSoft Json DateTime序列化

8

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

return Json(value);

在客户端上,我收到了以下内容:
"/Date(1336618438854)/"

如果我使用相同的返回值,则应该这样写:

return Json(JsonConvert.SerializeObject(value));

那么返回的序列化值(连同序列化对象)将具有时区意识:

"/Date(1336618438854-0400)/"

有没有一种方法可以在不进行双重序列化的情况下获取一致的DateTime结果?我在某个地方读到,微软将把Newtonsoft JSON包含到MVC中?


1
嗯,谷歌?这听起来很熟悉。牛顿的序列化工作正常。问题是为什么MVC在采用/Date()/格式时忽略了时区。 - user1188755
仅使用 $.parseJSON(result) 将正确解析日期。https://dev59.com/6nRB5IYBdhLWcg3wFz4g#4540007 - Pete
4个回答

11

我最终想通了该怎么做。
我将把我的项目切换到ISO 8601日期时间格式。使用JSON.net进行序列化非常方便,只需在对象上的datetime属性上加上JsonConverter属性即可。

    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) 就可以正确解析日期。https://dev59.com/6nRB5IYBdhLWcg3wFz4g#4540007 - Pete

0
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);

祝你好运 CAhumada


-2

如果您不想深入了解解析的事情,那么只需将日期转换为字符串,然后使用JSON解析它。

例如:

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

抱歉,但这篇文章不是关于展示日期的。它是关于在服务器到客户端和客户端到服务器的情况下,对包含DateTime属性的复杂对象进行序列化日期格式的一致性。而你在第二行建议我使用SerializeObject对整个对象进行操作。 - user1188755
@user1188755...请查看以下链接:https://dev59.com/nnRB5IYBdhLWcg3wSVi1 - alok_dida

-2
它返回服务器日期格式。您需要定义自己的函数。
function jsonDateFormat(jsonDate) {

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

};


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接