gpt4 book ai didi

c# - 具有 DateTime 成员的 DeserializeObject 不适用于 Json.Net

转载 作者:行者123 更新时间:2023-11-30 13:45:00 25 4
gpt4 key购买 nike

我正在从网络请求中检索一个 JSON,我想将其反序列化为以下类:

public class MyData
{
public int id { get; set; }
public DateTime openTime { get; set; }
MyData() {}
}

这是我从服务器收到的 JSON:

var json= @"{""Id"": ""12345"",""openTime"":""2015-09-01T12:00:00:000Z""}"

据我所知,这个 DateTime 字符串是 ISO 8601,但我不明白为什么末尾有三个 0 表示毫秒和一个附加的 Z。这就是我尝试将字符串转换为我的对象的方式:

var responseInstance = JsonConvert.DeserializeObject<MyData>(json,new IsoDateTimeConverter());

这将引发 System.FormatException:String 未被识别为有效的 DateTime。

当我尝试像这样添加 JsonSerializerSetting 而不是 IsoDateTimeConverter 时:

var deserializeSetting = new JsonSerializerSettings()
{
DateFormatHandling = DateFormatHandling.IsoDateFormat
};
var responseInstance = JsonConvert.DeserializeObject<MyData>(json,deserializeSetting);

没有抛出异常,而是日期时间成员始终显示 01.01.0001 00:00:00

最佳答案

问题是您的日期字符串格式不正确。秒和毫秒之间应该有一个句点字符 (.),而不是冒号 (:)。 Json.Net 在内部使用 DateTime.Parse 来解析日期。如果它失败了,那么它会默默地吃掉错误,并且永远不会在你的对象上设置日期。因此,您最终得到默认日期 01/01/0001 00:00:00。

编辑

如果您无法更改 JSON(例如,因为它由第三方控制),您可以使用自定义 JSON 转换器来正确反序列化错误格式。

class BadDateFixingConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(DateTime) || objectType == typeof(DateTime?));
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string rawDate = (string)reader.Value;
DateTime date;

// First try to parse the date string as is (in case it is correctly formatted)
if (DateTime.TryParse(rawDate, out date))
{
return date;
}

// If not, see if the string matches the known bad format.
// If so, replace the ':' with '.' and reparse.
if (rawDate.Length > 19 && rawDate[19] == ':')
{
rawDate = rawDate.Substring(0, 19) + '.' + rawDate.Substring(20);
if (DateTime.TryParse(rawDate, out date))
{
return date;
}
}

// It's not a date after all, so just return the default value
if (objectType == typeof(DateTime?))
return null;

return DateTime.MinValue;
}

public override bool CanWrite
{
get { return false; }
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

像这样使用它:

JsonSerializerSettings settings = new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new BadDateFixingConverter() },
DateParseHandling = DateParseHandling.None
};

MyData obj = JsonConvert.DeserializeObject<MyData>(json, settings);

fiddle :https://dotnetfiddle.net/M1w36e

关于c# - 具有 DateTime 成员的 DeserializeObject 不适用于 Json.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com