【问题标题】:Cannot deserialize JSON with both UTC and non UTC formatted datetimes无法使用 UTC 和非 UTC 格式的日期时间反序列化 JSON
【发布时间】:2020-02-23 16:36:50
【问题描述】:

我正在从外部 API 读取 JSON。由于某种原因,日期时间值的格式不同,我无法使用 Newtonsoft.Json 将其自动反序列化到我的对象中。

例如,假设以下是我的 JSON(两个日期时间值中的唯一差异是第一个以 'Z' 结尾,而第二个没有): 字符串 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;

运行上面的代码给了我:

字符串未被识别为有效的日期时间

任何帮助将不胜感激!

【问题讨论】:

    标签: c# json datetime json.net


    【解决方案1】:

    IsoDateTimeConverter 的日期时间格式字符串看起来不正确,请尝试按照以下方式更新它

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

    根据Custom date and time format stringsK格式说明符用于时区信息,没有Z格式说明符

    【讨论】:

    • 非常感谢帕维尔。我想是这样的,但我不确定如何以 UTC 格式表达“Z”。你的回答很完美!
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2023-03-21
    • 2019-07-27
    • 2023-03-23
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多