我在没有回答的情况下结束这个问题,因为它与此重复:Serializing null in JSON.NET
我正在编写一个简单的转换器,将m[i] = m[i] + (isdigit(m[i]) ? -2 : 1);
读为null
并将DateTime.UtcNow
写为null
。它可能是这样的:
DateTime.UtcNow.ToString("o")
现在,我正在尝试序列化并反序列化此对象。
public class NullableDateTimeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
//Console.WriteLine("object type: " + objectType.Name);
return objectType == typeof(DateTime?);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null)
{
return DateTime.Now;
}
else
{
return (DateTime?)reader.Value;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
serializer.Serialize(writer, DateTime.UtcNow.ToString("o"));
}
else
{
serializer.Serialize(writer, ((DateTime?)value).Value.ToString("o"));
}
}
}
像这样:
public class NullableDateTimeObject
{
public DateTime? Value { get; set; }
}
我预计第二个也会写ISO8601日期时间,但会写public static void Main()
{
var settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Include;
settings.DefaultValueHandling = DefaultValueHandling.Include;
settings.Converters.Add(new NullableDateTimeConverter());
Console.WriteLine("------- not null -------");
var result1 = JsonConvert.SerializeObject(
new NullableDateTimeObject { Value = DateTime.UtcNow },
settings);
Console.WriteLine(result1);
Console.WriteLine("------- null -------");
var result2 = JsonConvert.SerializeObject(
new NullableDateTimeObject { Value = null },
settings);
Console.WriteLine(result2);
Console.WriteLine("------- but it reads null -------");
var resultRead = JsonConvert.DeserializeObject<NullableDateTimeObject>(
"{\"Value\":null}",
settings);
Console.WriteLine(resultRead.Value);
}
。
null
当序列化对象时,JsonConverter甚至不会调用------- not null -------
{"Value":"2017-02-25T13:04:13.3091219Z"}
------- null -------
{"Value":null}
------- but it reads null -------
2/25/2017 1:14:56 PM
覆盖属性的空值。另一方面,它在反序列化对象时可以正常工作。
这是预期的行为吗?如何使用JsonConverter作为空值?
+我做了一个小提琴来重现它:https://dotnetfiddle.net/5PLvsk
[补充]
我还使用显式JsonConverter测试了属性,以防万一,如下:
CanConvert()
结果相同,为null。
public class NullableDateTimeObjectWithExplicitConverter
{
[JsonConverter(typeof(NullableDateTimeConverter))]
[JsonProperty(IsReference = true, DefaultValueHandling = DefaultValueHandling.Populate, NullValueHandling = NullValueHandling.Include)]
public DateTime? Value { get; set; }
}
Console.WriteLine("------- explicit converter -------");
var result3 = JsonConvert.SerializeObject(
new NullableDateTimeObjectWithExplicitConverter { Value = null },
settings);
Console.WriteLine(result3);
即使明确的一个有效,但JsonConverterSettings应该以递归方式工作,我认为。