![](/img/trans.png)
[英]Force JSON.NET to include milliseconds when serializing DateTime (even if ms component is zero)
[英]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
中的ReadJson
和WriteJson
方法不調用基本 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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.