Json.Net学习笔记(六) Json.Net中关于时间的序列化

DateTime类型在Json中表示是很难的。

问题来源于JSON spec (Json规范)自身,没有精确的语法。这个规范包括objects, arrays, strings, integers 和 floats,但是对于date是什么样子的没有定义准确的标准。

关于时间,Json.Net使用的默认格式与微软:"\/Date(1198908717056)\/"相同,您可以从此外获得更多信息.

DateTime JsonConverters

由于在Json中没有关于时间的准确标准,当与其他系统进行互操作时就会有大量不同的时间格式。幸运的是,Json.Net为了处理读写自定义时间提供了一个解决方案:JsonConverters. JsonConverter是用来重写一个类型如何被序列化的。

示例: 

public class LogEntry
    {
        public string Details { get; set; }
        public DateTime LogDate { get; set; }
    }

测试1:

       LogEntry logEntry = new LogEntry()
            {
                LogDate = new DateTime(2010, 12, 19, 0, 0, 0, DateTimeKind.Utc),
                Details = "Application started."
            };
            string defaultJson = JsonConvert.SerializeObject(logEntry, Formatting.Indented);
            Console.WriteLine(defaultJson);

输出结果:

{
  "Details": "Application started.",
  "LogDate": "\/Date(1292716800000)\/"
}

测试2:

    string javascriptJson = JsonConvert.SerializeObject(logEntry, Formatting.Indented, new JavaScriptDateTimeConverter());
     Console.WriteLine(javascriptJson);
输出结果:

{
  "Details": "Application started.",
  "LogDate": new Date(
    1292716800000
  )
}

测试3:

            string isoJson = JsonConvert.SerializeObject(logEntry, Formatting.Indented, new IsoDateTimeConverter());
            Console.WriteLine(isoJson);

输出结果:

{
  "Details": "Application started.",
  "LogDate": "2010-12-19T00:00:00Z"
}

 简单地,通过JsonConverter您可以使用Json.Net的序列化器

>JavaScriptDateTimeConverter

  JavaScriptDateTimeConverter类是来自于Json.Net的两个DataTime Json转换器之一,这个转换器序列化一个DateTime类型为一个JavaScipt日期对象(https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Date)

  new Date(1292716800000)

从技术上讲,根据规范这是无效的数据格式,但是所有的浏览器、和一些Json的框架包括Json.Net都支持它。

>IsoDateTimeConverter

  IsoDateTimeConverter序列一个DateTime类型为一个ISO 8601格式的字符串.

  "2010-12-19T00:00:00Z"

IsoDateTimeConverter 类有一个属性DateTimeFormat,用来更进一步的自定义字符串格式.

最后要注意的一件事是,所有被Json.Net返回的日期值都是UTC Time

posted @ 2011-11-16 13:31  awp110  阅读(357)  评论(0编辑  收藏  举报