我有一个包含对象的数组,我称之为ComplexThing,需要特殊的指令来反序列化。我创建了一个ContractResolver来修复我对另一个对象的引用循环问题。我以为我可以覆盖CreateMemberValueProvider()并创建一个IValueProvider来让我定义如何反序列化ComplexThing。我发现的问题是因为ComplexThing总是在一个数组中,所以从不为ComplexThing调用CreateMemberValueProvider()。
我猜我需要覆盖CreateArrayContract()来创建一个JsonArrayContract。我很难找到如何创建JsonArrayContract或找到我可以扩展的ArrayContractResolver的示例。对于我目前正在使用的ContractResolver,我扩展了DefaultContractResolver。数组有没有这样的东西?
编辑:
我找到了解决方法。我不确定这是正确的,但似乎有效。如果有人有更好的解决方案,我仍然会想要一些答案。
我在CreateArrayContract()中做了什么我检查它是否是ComplexThing类型的数组。如果是,我将自定义转换器添加到ItemConverter。
protected override JsonArrayContract CreateArrayContract(Type objectType)
{
var result = base.CreateArrayContract(objectType);
if (typeof(ComplexThing).IsAssignableFrom(result.CollectionItemType))
{
result.ItemConverter = new ComplexThingConverter();
}
return result;
}
转换器:
public class DataSnapInConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(ComplexType).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var result = serializer.Deserialize(reader, typeof(ComplexType));
return result;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}