using System.Collections;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
public abstract class BaseType { }
public class DerivedType1 : BaseType { public string Derived1 { get; set; } }
public class DerivedType2 : BaseType { public int Derived2 { get; set; } }
public class DerivedType3 : BaseType { public string Derived3 { get; set; } }
public static void Test()
var list = new List<BaseType> { new DerivedType1 { Derived1 = "value 1" } };
var resolver = new DefaultJsonTypeInfoResolver
if (typeInfo.Type != typeof(BaseType))
typeInfo.PolymorphismOptions = new()
new JsonDerivedType(typeof(DerivedType1), "Derived1"),
new JsonDerivedType(typeof(DerivedType2), "Derived2")
var options = new JsonSerializerOptions
TypeInfoResolver = resolver,
var json = JsonSerializer.Serialize(list, options);
Assert.That(json.Contains("value 1"));
var list2 = JsonSerializer.Deserialize<List<BaseType>>(json, options);
Assert.AreEqual(list2[0].GetType(), list[0].GetType());
var json2 = JsonSerializer.Serialize(list2, options);
Assert.AreEqual(json, json2);
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("System.Text.Json version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");