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

Newtonsoft自定义UnixDateTimeConverter序列化null转0问题求助

解决Newtonsoft.Json自定义Unix时间转换器null序列化不生效问题

问题核心

当DateTime?字段值为null时,Json.NET默认不会触发字段标记的JsonConverter的WriteJson方法,直接将null序列化为null(或按全局配置忽略),导致你写的null转0逻辑无法执行。

解决方案

修改自定义转换器,确保它能处理null值的序列化,同时保留原有反序列化逻辑:

void Main()
{
    var json1 = "{\"LastGood\":1708560000,\"LastBad\":0} ";
     
    var data = JsonConvert.DeserializeObject<Data>(json1).Dump("反序列化结果");

    json1.Dump("原始JSON");
    var json2 = JsonConvert.SerializeObject(data, new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Include
    }).Dump("序列化结果");
}

public class Data
{
    [JsonConverter(typeof(CustomUnixDateTimeConverter))]
    public DateTime? LastGood { get; set; }
    
    [JsonConverter(typeof(CustomUnixDateTimeConverter))]
    public DateTime? LastBad { get; set; }
}

public class CustomUnixDateTimeConverter : Newtonsoft.Json.Converters.UnixDateTimeConverter
{
    // 明确转换器支持可空DateTime类型
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime?) || base.CanConvert(objectType);
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        if (value == null)
        {
            // null值直接写入0
            writer.WriteValue(0L);
            return;
        }
        // 非null值调用基类处理逻辑
        base.WriteJson(writer, value, serializer);
    }

    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        if (reader.Value != null && (long)reader.Value == 0 && objectType == typeof(DateTime?))
            return null;

        return base.ReadJson(reader, objectType, existingValue, serializer);
    }
}

关键修改说明

  • 重写CanConvert:告知Json.NET该转换器可处理DateTime?类型,确保框架在处理该类型的null值时触发转换器。
  • WriteJson直接处理null:当传入值为null时,直接向JsonWriter写入0,跳过基类默认逻辑。
  • 设置NullValueHandling.Include:确保序列化时不忽略null值,让转换器有机会介入处理(若全局配置为Ignore,需单独指定此设置)。

修改后,反序列化时0转为null,序列化时null转回0,最终序列化结果会与原始JSON完全一致。

内容的提问来源于stack exchange,提问作者sgmoore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:10:57