如何设置 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
被序列化时,JSonConvert
er 将以偏移格式 [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 偏移量。 (巴西时间)
我连载的时候,我所有的日期都是当地时间,为了维护 与遗留应用程序的向后兼容性 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
被序列化时,JSonConvert
er 将以偏移格式 [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 偏移量。 (巴西时间)