JsonConvert.SerializeObject vs JsonSerializer.Serialize

时间:2013-03-05 22:03:37

标签: .net json.net

好吧我无法弄清楚为什么JsonConvert.SerializeObject序列化DateTime个对象的方式与JsonSerializer.Serialize不同。

鉴于课程

public class Test
{
     [JsonConverter(typeof(JavaScriptDateTimeConverter))]
     public DateTime DeliveryDate { get { return DateTime.Now; } }
}

@Html.Raw(JsonConvert.SerializeObject(new Test()))

输出:

"DeliveryDate": "2013-03-01T07:00:00.000Z"

但是当我在JsonNetResult中使用JsonSerializer.Serialize时: http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx

我得到以下输出:

"DeliveryDate": new Date(1362520794703)

我无法弄清楚为什么会出现这种不一致。我原以为JsonConvert.SerializeObject会在内部使用JsonSerializer

1 个答案:

答案 0 :(得分:6)

好吧我已经弄明白了,我希望分享以防任何人遇到这种情况。

很久以前,我无法在MVC4中序列化DateTime对象JsonResult。基本上我的DateTime个对象被序列化为"\/Date(1239018869048)\/"我想我已经阅读了作者对JSON.NET的回答,建议将[JsonConverter(typeof(JavaScriptDateTimeConverter))]添加到DateTime属性中。模型类并在视图中使用@Html.Raw(JsonConvert.SerializeObject(Model)。所以我确实做到了这一点,这解决了我当时 的短期问题

时间流逝,今天我需要支持在用户将一些内容发布到服务器后即时更新javascript viewModel。这导致我今天的错误。事实证明,我的所有DateTime属性都使用属性进行了修饰,当我尝试将它们序列化回客户端时,序列化程序WAS的行为与预期的一样。这让我相信JsonConvert.SerializeObject实际上尊重属性。

我删除了违规的属性后,一切都开始变得非常棒了。调整周围的事情我发现我可以使用默认的DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind,我可以忘记我的日期时间字符串中的Z