JsonConverter无法序列化空值属性

时间:2017-02-25 13:23:55

标签: c# json.net

我在没有回答的情况下结束这个问题,因为它与此重复: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应该以递归方式工作,我认为。

0 个答案:

没有答案