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