저는 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 사용을 보장하는 것입니다.