JsonConvert.SerializeObject与JsonSerializer.Serialize有何区别?

9

好的,我无法理解为什么JsonConvert.SerializeObjectDateTime对象的序列化方式与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


我想指出,我希望JsonNetResult输出的日期格式为"2013-03-01T07:00:00.000Z" - Mr. Young
1个回答

11

好的,我已经弄清楚了,并且想要分享一下,以防有人遇到这种情况。

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

时间过去了,今天我需要支持在用户向服务器提交一些内容后动态更新javascript viewModel。这就带来了我今天的错误。嗯,事实证明,我所有的DateTime属性都被装饰了这个属性,当我试图将它们序列化回客户端时,序列化程序并没有像预期的那样运行。这让我相信JsonConvert.SerializeObject实际上没有尊重这些属性。

我移除了有问题的属性后,一切都开始工作得很好。在调整一些东西后,我发现我可以只使用默认的DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind,并且可以忘记我的日期时间字符串中的Z


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