如何用自定义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
