簡體   English   中英

強制 JSON.NET 包括毫秒和 output null 用於 Z37A6259CC0C1DAE299A7866ZTime 序列化日期字段時

[英]Force JSON.NET to include milliseconds AND output null for a null date field when serializing DateTime

我在 Newtonsoft.Json 中遇到了DateTimeFormat問題。 我要發布到的 API 在所有日期上都需要毫秒。 我正在序列化的 object 有許多日期字段,其中一些是 null 的一些數據。

I can't seem to get the JSON to output both null for the null dates AND inlucde the milliseconds in the fields that have dates. 我可以得到一個或其他的工作,但不能同時工作。

很確定它是一件小事,但我還沒有設法深入了解它,我已經花了幾天的時間。

這正確輸出 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);
    }
}

這是 output:

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

"dateOfDeath": null`

這會正確輸出包括毫秒在內的日期,但 null 日期也會轉換為DateTime

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

這是 output:

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

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

我查看了以下兩篇 SO 文章,但無法讓它們一起工作。

強制 JSON.NET 在序列化 DateTime 時包含毫秒(即使 ms 分量為零)

JSON.NET 將 DateTime.MinValue 序列化為 null

非常感謝任何幫助。

問題是MinDateTimeConverter中的ReadJsonWriteJson方法不調用基本 class,因此在非空情況下處理自定義日期格式的正常處理永遠不會發生。 這是更正后的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM