2013-03-14 89 views
2

我正在使用ConcreteCollectionTypeConverter反序列化IList类型的对象。我可能做起来很错误的,因为我不断收到异常“无法转换目录到IList的”使用Newtonsoft JSON反序列化IList对象

我的目标inteface看起来是这样的:

[JsonObject(MemberSerialization.OptIn)] 
public IMyInterface { 

    [JsonProperty("associatedContact")] 
    [JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))] 
    IList<ISomeOtherInterface> MyObject { get; set; } 
} 

我的目标实现是这样的:

public MyImplementation : IMyInterface { 

    public List<SomeOtherImplementation> MyObject { get; set; } 

    public MyImplementations() { 
     MyObject = new List<SomeOtherImplementation>();   
    } 
} 

的json转换器看起来是这样的:

class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, value); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     return serializer.Deserialize<TImplementation>(reader); 
    } 
} 

我打电话给我的项目中的其他地方的反序列化方法是这样的:

var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString()); 

我上面提到的jsonObject被正确解析。

我知道这是可能的,因为我已经看到了一个来自用户调用SO的评论,他已经完成了它(Casting interfaces for deserialization in JSON.NET-接受的答案的第一评论)。

此方法适用于非集合项目(即使用JsonConverer(typeof(ConcreteTypeCOnverter))工作)反序列化接口类型IIterface MyObject的对象。

如果我只使用列表而不是IList,我甚至不需要类型转换器,但我的要求是确保ICollections的使用,因为可能存在非标准实现。

回答

1

我相信这会为你所需要的工作:

public class ConcreteListTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var res = serializer.Deserialize<List<TImplementation>>(reader); 
     return res.ConvertAll(x => (TInterface) x); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, value); 
    } 
} 
相关问题