在自定义的JsonConverter的ReadJson方法中处理null对象

20 浏览
0 Comments

在自定义的JsonConverter的ReadJson方法中处理null对象

我有一个Newtonsoft JSON.NET的JsonConverter,用来帮助反序列化一个类型为抽象类的属性。大致情况如下:

public class PetConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Animal);
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jsonObject = JObject.Load(reader);
        if (jsonObject["Lives"] != null) return jsonObject.ToObject(serializer);
        if (jsonObject["StopPhrase"] != null) return jsonObject.ToObject(serializer);
        return null;
    }
    public override bool CanWrite { get { return false; } }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    { throw new NotImplementedException(); }
}

它处理的类如下:

public abstract class Animal 
{ }
public class Cat : Animal
{
    public int Lives { get; set; }
}
public class Parrot : Animal
{
    public string StopPhrase { get; set; }
}
public class Person
{
    [JsonConverter(typeof(PetConverter))]
    public Animal Pet { get; set; }
}

当反序列化一个具有非空Pet的Person时,这个工作正常。但是,如果Pet为空,则ReadJson方法在第一行出现JsonReaderException:

An exception of type 'Newtonsoft.Json.JsonReaderException' occurred in Newtonsoft.Json.dll but was not handled in user code

Additional information: Error reading JObject from JsonReader. Current JsonReader item is not an object: Null. Path 'Pet', line 1, position 11.

我已经查看了Custom JsonConverter文档,但它只是关于写转换器的。我尝试了以下方法:

if (reader.Value == null) return null; // this inverts the [Test] results

但是我得到了以下结果:

JsonSerializationException: Additional text found in JSON string after finishing deserializing object.

对于属性被填充的情况。

简而言之,如何正确处理这种情况?

0