2013-03-14 5 views
2

저는 ConcreteCollectionTypeConverter를 사용하여 IList 유형의 객체를 비 직렬화합니다. 나는 예외를 점점 계속 때문에 아마 매우 잘못하고 있어요Newtonsoft JSON을 사용하여 IList 객체를 비 직렬화

내 객체 inteface을 이런 식으로 뭔가를 보이는 "은 IList에 목록을 변환 할 수 없습니다"

내 오브젝트의 구현은 다음과 같습니다
[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); 
    } 
} 

나는이 같은 내 프로젝트에서 다른 곳 직렬화 메소드를 호출하고 있습니다 : 내 된 JSONObject는 위에서 언급 한

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

가 올바르게 구문 분석됩니다.

나는 이것이 가능하다는 것을 알았 기 때문에 여기에 의견을 보았습니다. (Casting interfaces for deserialization in JSON.NET - 수락 된 답변의 첫 번째 의견).

이 방법은 컬렉션 이외의 항목 (즉, JsonConverer (typeof (ConcreteTypeCOnverter))을 사용하여 인터페이스 유형 IIterface MyObject의 객체를 deserialize하는 경우)에 잘 작동합니다.

ILists 대신 목록 만 사용하는 경우에도 형식 변환기가 필요하지 않지만 가능한 요구 사항은 비표준 구현이 가능하기 때문에 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); 
    } 
} 
관련 문제