using System.Collections;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using System.Text.Json.Nodes;
[JsonDerivedType(typeof(Apple),typeDiscriminator: "apple")]
public abstract class Fruit
public Seed seed { get; }
protected Fruit(Seed seed)
public sealed class Apple : Fruit
public Apple(AppleSeed seed) : base(seed) { }
public new AppleSeed seed => (AppleSeed)base.seed;
public sealed class AppleSeed : Seed
[JsonDerivedType(typeof(AppleSeed),typeDiscriminator: "apple")]
public abstract class Seed { }
public static void Test()
Fruit fruit = new Apple(new AppleSeed());
var json = JsonSerializer.Serialize(fruit);
var fruit2 = JsonSerializer.Deserialize<Fruit>(json);
var json2 = JsonSerializer.Serialize(fruit2);
Assert.That(fruit.GetType() == fruit2?.GetType());
Assert.That(fruit.seed.GetType() == fruit2?.seed?.GetType());
Assert.That(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: ");