NewtonSoft.JSON官方手册中文版【连载11】

在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,以进一步自定义格式化字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值