使用JsonConverter进行Json.NET自定义序列化 – 如何获取“默认”行为
我的类DataType有一个JsonConverter。 当Json中使用的普通字符串作为DataType类型的属性值时,我想做一些特殊处理。 在值是“完整”对象的情况下,我想进行“正常”反序列化。
这是我的尝试
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.Value != null && reader.ValueType == typeof (string)) { return someSpecialDataTypeInstance; } else if (reader.TokenType == JsonToken.StartObject) { DataType dataType = serializer.Deserialize(reader); return dataType; } else { throw new JsonSerializationException(); } }
但这不起作用,因为这一行:DataType dataType = serializer.Deserialize(reader); 导致无限递归。
这可以轻易地完成吗? (无需手动逐个财产)
一种简单的方法是分配一个类的实例,然后使用JsonSerializer.Populate(JsonReader, Object)
。 这是在标准CustomCreationConverter
完成的方式:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.Value != null && reader.ValueType == typeof(string)) { return someSpecialDataTypeInstance; } else if (reader.TokenType == JsonToken.StartObject) { existingValue = existingValue ?? serializer.ContractResolver.ResolveContract(objectType).DefaultCreator(); serializer.Populate(reader, existingValue); return existingValue; } else if (reader.TokenType == JsonToken.Null) { return null; } else { throw new JsonSerializationException(); } }
请注意,这不会处理启用TypeNameHandling
并且存在指定多态子"$type"
的"$type"
属性的情况。 在这种情况下,您需要使用Interface中的JsonConverter中更新的JsonDerivedTypeConverer
执行一些技巧。 这也假设该类型具有Json.NET可访问的无参数构造函数 。 如果没有,并且existingValue
为null,则需要通过new DataType(arg1, arg2, ...)
手动构造它。
样品小提琴 。