c# - 无法使用 UTC 和非 UTC 格式的日期时间反序列化 JSON
问题描述
我正在从外部 API 读取 JSON。由于某种原因,日期时间值的格式不同,我无法使用 Newtonsoft.Json 将其自动反序列化到我的对象中。
例如,假设以下是我的 JSON(两个日期时间值中的唯一差异是第一个以 'Z' 结尾,第二个没有): string json = "{ \"DateTime1\" : \"20131101T000000Z\" , \"DateTime2\" : \"20131101T000000\" }";
然后我需要将 2 个日期时间字段解析为一个包含 DateTime1 和 DateTime2 属性的对象,如下所示:
class Foo
{
public DateTime DateTime1 { get; set; }
public DateTime DateTime2 { get; set; }
}
我的反序列化代码如下所示:
var format = "yyyyMMddThhmmssZ"; // your datetime format
var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = format };
JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
serializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
serializerSettings.DateParseHandling = DateParseHandling.DateTimeOffset;
string json = "{ \"DateTime1\" : \"20131101T000000Z\", \"DateTime2\" : \"20131101T000000\" }";
try
{
var serializer = JsonSerializer.Create(serializerSettings);
var o3 = JsonConvert.DeserializeObject<Foo>(json, dateTimeConverter);
}
catch(Exception ex)
{
var x = ex.Message.ToString();
}
return;
运行上面的代码给了我:
字符串未被识别为有效的 DateTime
任何帮助将不胜感激!
解决方案
您的日期时间格式字符串IsoDateTimeConverter
看起来不正确,请尝试按照以下内容进行更新
var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyyMMddTHHmmssK" };
根据自定义日期和时间格式字符串,
K
格式说明符用于时区信息,没有Z
格式说明符