using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using System.Text.Json.Nodes;
public IList<NestedClass> MyList { get; set; }
public IList<AnotherNestedClass> NestedList { get; set; }
class AnotherNestedClass{
public string SomeValue { get; set; }
public class IListAsObservableCollectionConverter : JsonConverterFactory
public override bool CanConvert(Type typeToConvert) =>
typeToConvert.IsInterface && typeToConvert.IsGenericType && typeToConvert.GetGenericTypeDefinition() == typeof(IList<>);
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) =>
(JsonConverter)Activator.CreateInstance(typeof(IListAsObservableCollectionConverterGeneric<>).MakeGenericType(typeToConvert.GetGenericArguments()))!;
class IListAsObservableCollectionConverterGeneric<T> : JsonConverter<IList<T>>
public override void Write(Utf8JsonWriter writer, IList<T> value, JsonSerializerOptions options) =>
JsonSerializer.Serialize(writer, value, value.GetType(), options);
public override IList<T>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
JsonSerializer.Deserialize<ObservableCollection<T>>(ref reader, options);
public static void Test()
var options = new JsonSerializerOptions
Converters = { new IListAsObservableCollectionConverter() },
var inputModel = new MyClass
MyList = new ObservableCollection<NestedClass>()
NestedList = new ObservableCollection<AnotherNestedClass>()
new() { SomeValue = "value 1" }, new() { SomeValue = "value 2" },
var json = JsonSerializer.Serialize(inputModel, options);
Console.WriteLine("Input JSON:");
var obj = JsonSerializer.Deserialize<MyClass>(json, options);
Console.WriteLine(obj?.MyList?.GetType());
var json2 = JsonSerializer.Serialize(obj, options);
Assert.AreEqual(typeof(ObservableCollection<NestedClass>), obj?.MyList?.GetType());
Assert.That(obj!.MyList.Select(c => c?.NestedList?.GetType()).All(t => t == typeof(ObservableCollection<AnotherNestedClass>)));
Assert.That(inputModel.MyList.SelectMany(c => c.NestedList).Select(c2 => c2.SomeValue).SequenceEqual(
obj!.MyList.SelectMany(c => c.NestedList).Select(c2 => c2.SomeValue)));
Assert.AreEqual(expectedJson, json);
Assert.AreEqual(expectedJson, 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: ");