首页 > 解决方案 > 无法使用 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

任何帮助将不胜感激!

标签: c#jsondatetimejson.net

解决方案


您的日期时间格式字符串IsoDateTimeConverter看起来不正确,请尝试按照以下内容进行更新

var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyyMMddTHHmmssK" };

根据自定义日期和时间格式字符串K格式说明符用于时区信息,没有Z格式说明符


推荐阅读