Nicholas Westby เป็นทางออกที่ยอดเยี่ยมในบทความที่ยอดเยี่ยม
หากคุณต้องการ Deserializing 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);