using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
public static class JsonExtensions
public static DefaultJsonTypeInfoResolver AddOnDeserializing<T>(this DefaultJsonTypeInfoResolver resolver, Action<T> onDeserializing)
resolver.Modifiers.Add(typeInfo =>
if (typeof(T) == typeInfo.Type)
if (typeInfo.OnDeserializing == null)
typeInfo.OnDeserializing = (o) => onDeserializing((T)o);
var old = typeInfo.OnDeserializing;
typeInfo.OnDeserializing = (o) => { old(o); onDeserializing((T)o); };
public static DefaultJsonTypeInfoResolver AddOnDeserialized<T>(this DefaultJsonTypeInfoResolver resolver, Action<T> onDeserialized)
resolver.Modifiers.Add(typeInfo =>
if (typeof(T) == typeInfo.Type)
if (typeInfo.OnDeserialized == null)
typeInfo.OnDeserialized = (o) => onDeserialized((T)o);
var old = typeInfo.OnDeserialized;
typeInfo.OnDeserialized = (o) => { old(o); onDeserialized((T)o); };
public string FullName { get; set; }
public int Age { get; set; }
public static async Task Test()
Action<List<Person>> listCreated = l => { Console.WriteLine("Created list {0}", l); };
var list = new List<Person> { new Person { FullName = "John Doe", Age = 101 }, new Person { FullName = "Alice Bob", Age = 99 } };
using var stream = new MemoryStream();
await JsonSerializer.SerializeAsync(stream, list);
List<Person> allPeopleCreatedAnywhere = new();
Action<Person> personCreated1 = p => allPeopleCreatedAnywhere.Add(p);
Action<Person> personCreated2 = p => Console.WriteLine("Intercepted persion {0}", p);
var options = new JsonSerializerOptions
TypeInfoResolver = new DefaultJsonTypeInfoResolver()
.AddOnDeserialized(personCreated1)
.AddOnDeserialized(personCreated2)
PropertyNameCaseInsensitive = true,
var people = await JsonSerializer.DeserializeAsync<List<Person>>(stream, options);
Console.WriteLine("A total of {0} people were intercepted.", allPeopleCreatedAnywhere.Count);
Assert.AreEqual(list.Count, allPeopleCreatedAnywhere.Count);
public static async Task Main(string[] args)
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version);
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Assembly.GetName().Name, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");