如何用自定义Converter序列化多态集合为JSON?

摘要:测试类: [JsonConverter(typeof(PersonConverter))] public class Person { public string FirstName { get; set; } public string
测试类: [JsonConverter(typeof(PersonConverter))] public class Person { public string FirstName { get; set; } public string LastName { get; set; } } [JsonConverter(typeof(PersonConverter))] public class Employee : Person { public string Department { get; set; } public string JobTitle { get; set; } } [JsonConverter(typeof(PersonConverter))] public class Artist : Person { public string Skill { get; set; } }    自定义Converter: public class PersonConverter : JsonConverter<Person> { public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { JsonDocument.TryParseValue(ref reader, out var doc); var elm = doc.RootElement; elm.TryGetProperty("isBase", out var jEl); elm.TryGetProperty("typeName", out var typeEl); elm.TryGetProperty("obj", out var objEl); var typeStr = typeEl.GetString(); var type = Type.GetType(typeStr); var objStr = objEl.GetRawText(); var dic = JsonSerializer.Deserialize<Dictionary<string, string>>(objStr); var obj = ToObject(dic, type); return obj as Person; } public override bool CanConvert(Type typeToConvert) { if (typeToConvert == typeof(Person)) return true; if (typeToConvert.BaseType == typeof(Person)) return true; return false; } public override void Write(Utf8JsonWriter writer, Person value, JsonSerializerOptions options) { var type = value.GetType(); var dic = new { typeName = type.FullName, obj = ToDictionary(value), }; JsonSerializer.Serialize(writer, dic, options); } public Dictionary<string, object> ToDictionary(object obj) { if (obj == null) throw new ArgumentNullException(nameof(obj)); var dictionary = new Dictionary<string, object>(); foreach (va
阅读全文