如何创建JsonArrayContract?

时间:2014-01-20 17:09:58

标签: json.net

我有一个包含对象的数组,我称之为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);
    }
}

0 个答案:

没有答案