【问题标题】:How Can I setup the Json.Net serializer to behave in a custom way?如何设置 Json.Net 序列化程序以自定义方式运行?
【发布时间】:2015-07-28 20:35:55
【问题描述】:

当我序列化时,我所有的日期都将是当地时间,以保持 与读取/写入同一数据库或执行服务器到服务器集成的遗留应用程序的向后兼容性。 但我想为我的消费者的 web api 生成 UTC(ISO 格式)字符串,因为他们可以在我国家的任何地方。 由于我住在巴西,而且这个国家有超过 1 个时区,我确实必须处理这种语言环境混乱。

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

巴西(巴西时间)在 -03:00 偏移,那么:

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

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

如果可能,我想要一个应用程序范围的解决方案,IOW,我不想用自定义的 JsonConverter 装饰每个类或属性

你能给我建议吗?

【问题讨论】:

  • 将您自己的转换器添加到 JsonSerializer 的转换器列表中。
  • @Brannon,我想我不再需要这个了,DateTimeZoneHandling.Local 可以解决问题。我使用的是旧版本。我应该添加答案以供将来参考吗?还是这个问题太局限了?
  • @Brannon 在最新版本 7.0.1 中,DateTimeZoneHandling.Local 在本地日期正确读取 18:00Z 到 15:00 并在序列化时正确生成 15:00 到 15:00-03:00 .它采用偏移格式,但适用于我的情况
  • @EProgrammerNotFound:是的,请写下你的解决方案,作为其他有同样问题的人的答案。
  • @EProgrammerNotFound:我只想添加一行如何配置JsonConvert 以使用DateTimeZoneHandling.Local。否则看起来不错。

标签: c# datetime asp.net-web-api json.net locale


【解决方案1】:

您描述的是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,在WebApiConfig的Register()方法中添加以下代码:

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 偏移量。 (巴西时间)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多