将.NET DateTime序列化为Json字符串

时间:2012-02-01 18:49:21

标签: .net json datetime serializer

我正在编写一个自定义Json序列化程序来改善我的服务性能。是的,在我做出决定之前,我确实考虑过Json.NET,servicestack,DataContractJsonSerializer等。我的对象与简单的.NET类型是平的,我想避免更大的库的开销。

无论如何,这是我遇到一个小问题的地方。我有序列化DateTime的代码 -

    var epoch = new DateTime(1970, 1, 1, 0, 0, 0);
    sb.Append("\"\\/Date(");
    SerializeNumber((time - epoch).TotalMilliseconds, sb);
    sb.Append(")\\/\"");

这很好用,除了我不能完全匹配输出中的默认.NET Json序列化程序。

.NET serializer 
"\\/Date(1328057884253)\\/\"
Custom serializer
"\\/Date(1328057884253.04)\\/\"

嗯,所以我试着让我的转换不那么精确并切换到(int)TotalSeconds而不是毫秒,这给了我这个 -

.NET serializer
"\\/Date(1328054810067)\\/\"
Custom serializer
"\\/Date(1328054810)\\/\"

我猜这不会是一个大问题但是为了理智而让我的单元测试通过默认的.NET序列化器会很好。有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

属性 TotalMilliseconds 的类型为 double 。您可以将其强制转换为 long ,而不是使用TotalSeconds方法,该方法当然不会返回相同的值...

var epoch = new DateTime(1970, 1, 1, 0, 0, 0);
sb.Append("\"\\/Date(");
SerializeNumber((long)(time - epoch).TotalMilliseconds, sb);
sb.Append(")\\/\"");

编辑:正如Kosh在评论中所说,喜欢 int 以避免容量溢出。

答案 1 :(得分:0)

你不能截断结果吗?

Math.Truncate((time - epoch).TotalMilliseconds)

http://msdn.microsoft.com/de-de/library/c2eabd70.aspx

或者可能更好地围绕它。不知道JsonSerializer会做什么。

Math.Round((time - epoch).TotalMilliseconds, 0)

http://msdn.microsoft.com/de-de/library/75ks3aby.aspx