using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using System.Text.Json.Nodes;
[JsonDerivedType(typeof(Person), typeDiscriminator: "P")]
[JsonDerivedType(typeof(Adult), typeDiscriminator: "S")]
public string Name { get; set; }
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(typeof(Adult), typeDiscriminator: "A")]
public class Adult : Person;
public static partial class JsonExtensions
public const string MyTypeDiscriminatorPropertyName = "__type";
public static Action<JsonTypeInfo> SetupMyTypeDiscriminatorPropertyName() =>
SetupTypeDiscriminatorPropertyName(MyTypeDiscriminatorPropertyName);
public static Action<JsonTypeInfo> SetupTypeDiscriminatorPropertyName(string name) =>
(JsonTypeInfo typeInfo) =>
if (typeInfo.PolymorphismOptions != null)
typeInfo.PolymorphismOptions.TypeDiscriminatorPropertyName = name;
public static void Test()
var people = new Person[] { new Person { Name = "AbcPerson" }, new Adult { Name = "foo" } };
var options = new JsonSerializerOptions
TypeInfoResolver = new DefaultJsonTypeInfoResolver()
.WithAddedModifier(JsonExtensions.SetupMyTypeDiscriminatorPropertyName()),
var json = JsonSerializer.Serialize(people, options);
var people2 = JsonSerializer.Deserialize<Person []>(json, options);
Assert.That(json.Contains("\"__type\""));
Assert.That(!json.Contains("\"$type\""));
Assert.That(people.Select(p => p.GetType()).SequenceEqual(people2!.Select(p => p.GetType())));
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: ");