<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

DefaultReferenceResolver

using Newtonsoft.Json.Utilities; using System.Globalization; using System.Runtime.CompilerServices; namespace Newtonsoft.Json.Serialization { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] internal class DefaultReferenceResolver : IReferenceResolver { private int _referenceCount; private BidirectionalDictionary<string, object> GetMappings(object context) { JsonSerializerInternalBase jsonSerializerInternalBase = context as JsonSerializerInternalBase; if (jsonSerializerInternalBase == null) { JsonSerializerProxy jsonSerializerProxy = context as JsonSerializerProxy; if (jsonSerializerProxy == null) throw new JsonException("The DefaultReferenceResolver can only be used internally."); jsonSerializerInternalBase = jsonSerializerProxy.GetInternalSerializer(); } return jsonSerializerInternalBase.DefaultReferenceMappings; } public object ResolveReference(object context, string reference) { GetMappings(context).TryGetByFirst(reference, out object second); return second; } public string GetReference(object context, object value) { BidirectionalDictionary<string, object> mappings = GetMappings(context); if (!mappings.TryGetBySecond(value, out string first)) { _referenceCount++; first = _referenceCount.ToString(CultureInfo.InvariantCulture); mappings.Set(first, value); } return first; } public void AddReference(object context, string reference, object value) { GetMappings(context).Set(reference, value); } public bool IsReferenced(object context, object value) { string first; return GetMappings(context).TryGetBySecond(value, out first); } } }