using System.Collections.Generic;
using System.Text.Json.Serialization;
static void Main(string[] args)
var refHandler = new MyRefHandler();
var opts = new JsonSerializerOptions
ReferenceHandler = refHandler
var refResolver = new MyRefResolver();
refHandler.Resolver = refResolver;
var employee = new Employee() { Name = "Bob" };
refResolver.AddReference("1", employee);
string json = @"{""$ref"":""1""}";
Employee deserializedObject = JsonSerializer.Deserialize<Employee>(json, opts);
json = JsonSerializer.Serialize(deserializedObject);
class MyRefHandler : ReferenceHandler
public ReferenceResolver Resolver { get; set; }
public override ReferenceResolver CreateResolver() => Resolver;
class MyRefResolver : ReferenceResolver
private uint _referenceCount;
private readonly Dictionary<string, object> _referenceIdToObjectMap = new();
private readonly Dictionary<object, string> _objectToReferenceIdMap = new();
public override void AddReference(string referenceId, object value)
if (!_referenceIdToObjectMap.TryAdd(referenceId, value))
throw new JsonException();
public override string GetReference(object value, out bool alreadyExists)
if (_objectToReferenceIdMap.TryGetValue(value, out string referenceId))
referenceId = _referenceCount.ToString();
_objectToReferenceIdMap.Add(value, referenceId);
public override object ResolveReference(string referenceId)
if (!_referenceIdToObjectMap.TryGetValue(referenceId, out object value))
throw new JsonException();
public string Name { get; set; }