在自定义的JsonConverter的ReadJson方法中处理null对象
在自定义的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.
对于属性被填充的情况。
简而言之,如何正确处理这种情况?