如何设置 Json.Net 序列化程序以自定义方式运行?

How Can I setup the Json.Net serializer to behave in a custom way?

我连载的时候,我所有的日期都是当地时间,为了维护 与遗留应用程序的向后兼容性 read/write 到同一数据库或执行服务器到服务器集成。 但是我想为我的消费者 api 生成 UTC(ISO 格式)字符串,因为他们可以在我的国家/地区的任何地方。 因为我住在巴西,而且这个国家有多个时区,所以我不得不处理这个混乱的语言环境。

当我反序列化时,由于向后兼容性,我想将 utc 格式的字符串转换为本地格式。

巴西(巴西利亚时间)偏移 -03:00,则:

当网络 api 消费者输入:“...T18:00:00.000Z”时,在网络 api 端 DateTime 时间需要变为“15 :00:00" 本地格式。

当 Web api 输出完全相同的“15:00:00”DateTime 时,序列化程序应该将该时间转换回“...T18:00:00.000Z” utc 格式。

如果可能的话,我想要一个应用程序范围的解决方案,IOW,我不想用自定义 JsonConverter

装饰每个 class 或 属性

你能给我一些建议吗?

您描述的是 DateTimeZoneHandling.Local 的行为,至少在 7.0.1 版本中是这样,这是回答此问题时的最新版本。

实际上有一个小区别:当 DateTime 被序列化时,JSonConverter 将以偏移格式 [15:00-03:00] 而不是 UTF 格式 [18:00Z]。这是预期的,我相信(至少对我来说是有意义的),因为 SerializerSettings 中的格式是 DateTimeZoneHandling.Local,如果它是 DateTimeZoneHandling.Utc,它将产生 18:00Z,正如预期的那样。

当 DateTime 被反序列化时,UTC 格式的值(例如 "2015-01-01T18:00:00.000Z")将正确地变为与 new DateTime(2015, 1, 1, 15, 0, 0, DateTimeKind.Local) 相同的值。

要配置 JsonConvert,请在 WebApiConfigRegister() 方法中添加以下代码:

using Newtonsoft.Json;
...
public static void Register(HttpConfiguration config)
{
    var settings = config.Formatters.JSonFormatter.SerializerSettings;
    settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
    settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
}

免责声明:测试结果来自 -03:00 偏移量。 (巴西时间)