【问题标题】:specify global settings for Json.Net for DateTime serialization/deserialization为 DateTime 序列化/反序列化指定 Json.Net 的全局设置
【发布时间】:2013-03-22 12:46:59
【问题描述】:

是否可以设置 JSON.Net,以便如果您想序列化 DateTime,它将被序列化为 UTC 格式。从字符串反序列化时,将其反序列化为“LocalTime”。例如:

  • 序列化
    • 01/01/2012 16:00:00 (Kind = UTC) 存储为 2012-01-01T16:00:00Z
    • 01/01/2012 16:00:00(种类 = 本地,GMT +1)-> 存储为 2012-01-01T15:00:00Z
  • 反序列化(假设机器的本地时间 = GMT+1)
    • 2012-01-01T16:00:00Z -> 反序列化为 01/01/2012 17:00 +1GMT(种类 = 本地)
    • 2012-01-01T15:00:00Z -> 反序列化为 01/01/2012 16:00 +1GMT(种类 = 本地)

但是,我希望这“自动”发生,而不必每次都使用设置来指定它 - 就像全局设置一样。这可能吗?

【问题讨论】:

    标签: json.net


    【解决方案1】:

    在 ASP.NET WebAPI 中,这是可能的。试试这个:

    // Converters will be userd during serialization (override DateTimeZoneHandling)
    config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AdjustToUniversal });
    // DateTimeZoneHandling will be effective during deserialization
    config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
    

    【讨论】:

    • 我一直在尝试使用默认设置的DateTimeZoneHandling,但无法使其正常工作。可能是因为默认设置同时适用于序列化器和反序列化器。
    【解决方案2】:

    作为将来参考的注释,对此的“修复”不是使用DateTime,而是使用DateTimeOffset,因为DateTime 可能会对其实际所在的时区带来各种混淆。

    DateTimeOffset 的存储没有歧义,因为它始终包含时区,并且无论何时何地都始终指向同一时间点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多