You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:25:16