【问题标题】:Force JSON.NET to include milliseconds AND output null for a null date field when serializing DateTime强制 JSON.NET 在序列化 DateTime 时包含毫秒并为空日期字段输出空值
【发布时间】:2021-07-29 06:42:25
【问题描述】:

我在 Newtonsoft.Json 中使用 DateTimeFormat 时遇到问题。我发布到的 API 在所有日期上都需要毫秒。我正在序列化的对象有许多日期字段,其中一些对于某些数据为空。

我似乎无法让 JSON 为空日期输出 null 并在具有日期的字段中包含毫秒。我可以让一个或另一个工作,但不能同时工作。

很确定这是一件小事,但我还没有设法深入了解它,我已经花了几天时间。

这会正确输出 null,但不包括毫秒:

public string ToJson()
{   
    return JsonConvert.SerializeObject(this, new MinDateTimeConverter()).ToString();
}
    
public class MinDateTimeConverter : IsoDateTimeConverter
{
    public MinDateTimeConverter()
    {
        DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'";
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.Value == null)
            return DateTime.MinValue;

        return (DateTime)reader.Value;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        DateTime dateTimeValue = (DateTime)value;
        if (dateTimeValue == DateTime.MinValue)
        {
            writer.WriteNull();
            return;
        }

        writer.WriteValue(value);
    }
}

这是输出:

"dateOfBirth": "1943-03-02T00:00:00Z",  

"dateOfDeath": null`

这会正确输出包括毫秒在内的日期,但空日期也会转换为 DateTime

public string ToJson()
{           
    return JsonConvert.SerializeObject(this, new IsoDateTimeConverter() { DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" }).ToString();
}

这是输出:

"dateOfBirth": "1943-03-02T00:00:00.000Z",

"dateOfDeath": "0001-01-01T00:00:00.000Z"   

我查看了以下两篇 SO 文章,但无法让它们一起工作。

Force JSON.NET to include milliseconds when serializing DateTime (even if ms component is zero)

JSON.NET Serialize DateTime.MinValue as null

非常感谢任何帮助。

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

    问题是MinDateTimeConverter 中的ReadJsonWriteJson 方法不调用基类,因此在非空情况下处理自定义日期格式的正常处理永远不会发生。这是更正后的代码:

    public class MinDateTimeConverter : IsoDateTimeConverter
    {
        public MinDateTimeConverter()
        {
            DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'";
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (objectType == typeof(DateTime) && reader.TokenType == JsonToken.Null)
                return DateTime.MinValue;
    
            return base.ReadJson(reader, objectType, existingValue, serializer);
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value is DateTime date && date == DateTime.MinValue)
            {
                writer.WriteNull();
                return;
            }
            
            base.WriteJson(writer, value, serializer);
        }
    }
    

    小提琴:https://dotnetfiddle.net/x8PAzf

    【讨论】:

    • 完美,效果很好。感谢您的帮助!
    • 没问题;很高兴我能帮上忙!
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2013-12-17
    相关资源
    最近更新 更多