using System.Collections;
using System.Collections.Generic;
using System.Text.Json.Serialization;
[JsonDerivedType(typeof(DerivedType), "DerivedType:#MyNamespace")]
[JsonDerivedType(typeof(DerivedOfDerivedType), "DerivedOfDerivedType:#MyNamespace")]
public abstract class BaseType { }
[JsonDerivedType(typeof(DerivedOfDerivedType), "DerivedOfDerivedType:#MyNamespace")]
public class DerivedType : BaseType { public string DerivedValue { get; set; } }
public class DerivedOfDerivedType : DerivedType { public string DerivedOfDerivedValue { get; set; } }
public static void Test()
public static void TestBase()
var list = new List<BaseType> { new DerivedOfDerivedType { DerivedValue = "value 1", DerivedOfDerivedValue = "value of DerivedOfDerived" } };
var json = JsonSerializer.Serialize(list);
Assert.That(json.Contains("value 1"));
Assert.That(json.Contains("value of DerivedOfDerived"));
var list2 = JsonSerializer.Deserialize<List<BaseType>>(json);
Assert.AreEqual(list2[0].GetType(), list[0].GetType());
var json2 = JsonSerializer.Serialize(list2);
Assert.AreEqual(json, json2);
public static void TestDerivedType()
var list = new List<DerivedType> { new DerivedOfDerivedType { DerivedValue = "value 1", DerivedOfDerivedValue = "value of DerivedOfDerived" } };
var json = JsonSerializer.Serialize(list);
Assert.That(json.Contains("value 1"));
Assert.That(json.Contains("value of DerivedOfDerived"));
var list2 = JsonSerializer.Deserialize<List<DerivedType>>(json);
Assert.AreEqual(list2[0].GetType(), list[0].GetType());
var json2 = JsonSerializer.Serialize(list2);
Assert.AreEqual(json, json2);
public static void Test<TBaseType, TDerivedOfDerivedType>()
where TBaseType : BaseType
where TDerivedOfDerivedType : DerivedOfDerivedType, TBaseType, new()
var list = new List<TBaseType> { new TDerivedOfDerivedType { DerivedValue = "value 1", DerivedOfDerivedValue = "value of DerivedOfDerived" } };
var json = JsonSerializer.Serialize(list);
Assert.That(json.Contains("value 1"));
Assert.That(json.Contains("value of DerivedOfDerived"));
var list2 = JsonSerializer.Deserialize<List<BaseType>>(json);
Assert.AreEqual(list2[0].GetType(), list[0].GetType());
var json2 = JsonSerializer.Serialize(list2);
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: ");