JamesNK/Newtonsoft.Json · error · ArgumentNullException

Reference resolver cannot be null.

Error message

Reference resolver cannot be null.

What it means

Thrown by the JsonSerializer.ReferenceResolver setter when assigning null. The reference resolver implements $ref/$id object-preservation semantics; a null resolver would cause NullReferenceExceptions later during serialization, so the setter fails fast with ArgumentNullException.

Source

Thrown at Src/Newtonsoft.Json/JsonSerializer.cs:98

        private string? _dateFormatString;
        private bool _dateFormatStringSet;

        /// <summary>
        /// Occurs when the <see cref="JsonSerializer"/> errors during serialization and deserialization.
        /// </summary>
        public virtual event EventHandler<ErrorEventArgs>? Error;

        /// <summary>
        /// Gets or sets the <see cref="IReferenceResolver"/> used by the serializer when resolving references.
        /// </summary>
        public virtual IReferenceResolver? ReferenceResolver
        {
            get => GetReferenceResolver();
            set
            {
                if (value == null)
                {
                    throw new ArgumentNullException(nameof(value), "Reference resolver cannot be null.");
                }

                _referenceResolver = value;
            }
        }

        /// <summary>
        /// Gets or sets the <see cref="SerializationBinder"/> used by the serializer when resolving type names.
        /// </summary>
        [Obsolete("Binder is obsolete. Use SerializationBinder instead.")]
        public virtual SerializationBinder Binder
        {
            get
            {
                if (_serializationBinder is SerializationBinder legacySerializationBinder)
                {
                    return legacySerializationBinder;
                }

View on GitHub (pinned to 4f73e74372)

Solutions

  1. To disable reference preservation, set PreserveReferencesHandling = None on settings instead of nulling the resolver.
  2. Provide a concrete IReferenceResolver (e.g. new DefaultReferenceResolver()) when one is required.
  3. Guard DI/config: serializer.ReferenceResolver = resolver ?? new DefaultReferenceResolver();.

Example fix

// before
serializer.ReferenceResolver = null;

// after
settings.PreserveReferencesHandling = PreserveReferencesHandling.None;
Defensive patterns

Strategy: validation

Validate before calling

serializer.ReferenceResolver = resolver ?? throw new ArgumentNullException(nameof(resolver));
// or: settings.PreserveReferencesHandling = resolver == null ? PreserveReferencesHandling.None : PreserveReferencesHandling.Objects;

Type guard

static bool HasReferenceResolver(JsonSerializer s) => s.ReferenceResolver is not null;

Prevention

When it happens

Trigger: Assigning serializer.ReferenceResolver = null; passing a null resolver from configuration; clearing a resolver by setting null instead of using a default implementation.

Common situations: Conditionally disabling reference preservation by assigning null; DI containers returning null for an unregistered IReferenceResolver; tests stubbing a null resolver.

Related errors


AI-assisted analysis of JamesNK/Newtonsoft.Json@4f73e74372 (2026-08-07). Data as JSON: /api/errors/85a0d0bfe51985d9. Report an issue: GitHub.