如何从JSON反序列化C#中的TimeOnly类型?
解决方法
核心原因
Newtonsoft.Json在低于13.0.1的版本中不原生支持.NET 6+引入的TimeOnly类型,序列化时会将其转为包含Ticks、Hour等字段的JSON对象,而非字符串;反序列化为Dictionary<string, string>时,程序尝试将JSON对象直接转换为string类型,导致类型转换异常崩溃。即使使用高版本,若未正确配置序列化规则,也可能出现类似问题。
具体解决方案
升级Newtonsoft.Json版本
直接将Newtonsoft.Json(Json.NET)升级到13.0.1及以上版本,该版本开始原生支持TimeOnly和DateOnly类型,会自动将TimeOnly序列化为ISO标准时间字符串(如"15:45:30"),反序列化为string时可直接匹配,不会崩溃。自定义JsonConverter兼容低版本
若无法升级版本,可自定义TimeOnly的序列化转换器,强制将其序列化为字符串格式:public class TimeOnlyConverter : JsonConverter<TimeOnly> { private const string TimeFormat = "HH:mm:ss"; public override TimeOnly ReadJson(JsonReader reader, Type objectType, TimeOnly existingValue, bool hasExistingValue, JsonSerializer serializer) { return TimeOnly.Parse(reader.Value.ToString()); } public override void WriteJson(JsonWriter writer, TimeOnly value, JsonSerializer serializer) { writer.WriteValue(value.ToString(TimeFormat)); } }序列化时指定转换器:
var settings = new JsonSerializerSettings(); settings.Converters.Add(new TimeOnlyConverter()); var json = JsonConvert.SerializeObject(product, settings); return JsonConvert.DeserializeObject<Dictionary<string, string>>(json);临时处理方案(快速验证)
若仅需临时解决,可在序列化前手动将product中的TimeOnly成员转为字符串,再序列化。但此方法需修改原对象结构,仅适合简单场景。
内容的提问来源于stack exchange,提问作者DP.
相关产品推荐
相关产品推荐

