在JSON中序列化日期
JSON中的日期时间是很难的。
这个问题来自于JSON规范文档本身:JSON中没有针对日期的字面值语法。此规范文档具有对象、数组、字符串、整型数以及浮点数,但是它没有为日期应该如何表示定义标准。
日期和Json.NET
Json.NET中所用的默认日期模式是ISO 8601标准:“2012-03-19T07:22Z
”。
在Json.NET 4.5之前,日期是使用Microsoft格式编写的:“\/Date(1198908717056)\/
”。如果你想要使用这种格式,或者如果你想要保持与Microsoft JSON序列化器的兼容性,或保持与旧盯死Json.NET的兼容性,则请把DateFormatHandling设置改为MicrosoftDateFormat。
DateTimeZoneHandling设置可以用来在序列化时转换DateTime的DateTimeKind。例如,把DateTimeZoneHandling设置为Utc,针把所有的DateTimes序列化为UTC日期。请注意,此设置不影响DateTimeOffsets。
如果你不想遵守ISO 8601标准,则DateFormatString设置可以用来自定义日期字符串的格式,使用.NET的自定义日期和时间格式语法来读写日期字符串。
DateTime JsonConverters
因为JSON中没有日期标准,所以与其他系统交互时可能出现的不同格式的数量是无止境的。幸运的是Json.NET已经有了一个解决方案来处理读写自定义日期:JsonConverters。JsonConverter用来覆盖序列化某个类型的方式。
DateTime JsonConverters示例
public class LogEntry
{
public string Details { get; set; }
public DateTime LogDate { get; set; }
}
[Test]
public void WriteJsonDates()
{
LogEntry entry = new LogEntry
{
LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),
Details = "Application started."
};
// default as of Json.NET 4.5
string isoJson = JsonConvert.SerializeObject(entry);
// {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}
JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string microsoftJson = JsonConvert.SerializeObject(entry, microsoftDateFormatSettings);
// {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}
string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
// {"Details":"Application started.","LogDate":new Date(1234656000000)}
}
只需要把你想要使用的JsonConverter传给Json.NET序列化器。
JavaScriptDateTimeConverter
JavaScriptDateTimeConverter类是Json.NET附带的两个DateTime JsonConverter之一。此转换器会把一个DateTime序列化为一个JavaScript Date对象:new Date(1234656000000)
。
从技术上讲,根据规范,这是无效的JSON,但是所有浏览器和一些JSON框架(包括JSON.NET)都支持它。
IsoDateTimeConverter
Caution |
---|
Json.NET 4.5及以后的.NET版本中,默认情况下日期是使用ISO 8601格式编写的,所以不需要使用此转换器。 |
IsoDateTimeConverter会把DateTime序列化为ISO 8601 格式的字符串:“2009-02-15T00:00:00Z
”。
IsoDateTimeConverter类具有一个属性DateTimeFormat,以进一步自定义格式化字符串。