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
相关产品推荐
相关产品推荐

