Nicholas Westby는 멋진 기사 에서 훌륭한 솔루션을 제공했습니다 .
다음과 같은 인터페이스를 구현하는 가능한 많은 클래스 중 하나로 JSON을 역 직렬화하려는 경우 :
public class Person
{
public IProfession Profession { get; set; }
}
public interface IProfession
{
string JobTitle { get; }
}
public class Programming : IProfession
{
public string JobTitle => "Software Developer";
public string FavoriteLanguage { get; set; }
}
public class Writing : IProfession
{
public string JobTitle => "Copywriter";
public string FavoriteWord { get; set; }
}
public class Samples
{
public static Person GetProgrammer()
{
return new Person()
{
Profession = new Programming()
{
FavoriteLanguage = "C#"
}
};
}
}
사용자 지정 JSON 변환기를 사용할 수 있습니다.
public class ProfessionConverter : JsonConverter
{
public override bool CanWrite => false;
public override bool CanRead => true;
public override bool CanConvert(Type objectType)
{
return objectType == typeof(IProfession);
}
public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
{
throw new InvalidOperationException("Use default serialization.");
}
public override object ReadJson(JsonReader reader,
Type objectType, object existingValue,
JsonSerializer serializer)
{
var jsonObject = JObject.Load(reader);
var profession = default(IProfession);
switch (jsonObject["JobTitle"].Value())
{
case "Software Developer":
profession = new Programming();
break;
case "Copywriter":
profession = new Writing();
break;
}
serializer.Populate(jsonObject.CreateReader(), profession);
return profession;
}
}
그리고 "Profession"속성을 JsonConverter 속성으로 장식하여 사용자 지정 변환기를 사용하도록 알려야합니다.
public class Person
{
[JsonConverter(typeof(ProfessionConverter))]
public IProfession Profession { get; set; }
}
그런 다음 인터페이스를 사용하여 클래스를 캐스팅 할 수 있습니다.
Person person = JsonConvert.DeserializeObject<Person>(jsonString);