/// <summary>
        /// Reads the JSON representation of the object.
        /// </summary>
        /// <param name="reader">The <see cref="JsonReader"/> to read from.</param>
        /// <param name="objectType">Type of the object.</param>
        /// <param name="existingValue">The existing value of object being read.</param>
        /// <param name="serializer">The calling serializer.</param>
        /// <returns>The object value.</returns>
        public override object ReadJson(
            JsonReader reader,
            Type objectType,
            object existingValue,
            JsonSerializer serializer)
        {
            if (reader is null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (objectType is null)
            {
                throw new ArgumentNullException(nameof(objectType));
            }

            if (serializer is null)
            {
                throw new ArgumentNullException(nameof(serializer));
            }

            var dynamicConstructor = FastActivator.GetDynamicConstructor <IEnumerable <object> >(objectType);

            if (reader.TokenType == JsonToken.StartArray)
            {
                var items = new List <object>();

                while (reader.Read())
                {
                    if (reader.TokenType == JsonToken.EndArray)
                    {
                        break;
                    }

                    if (reader.TokenType == JsonToken.Null)
                    {
                        continue;
                    }

                    var item = ProcessToken(reader, objectType.GenericTypeArguments, serializer);
                    items.Add(item);
                }

                return(dynamicConstructor(items));
            }
            else if (reader.TokenType != JsonToken.Null)
            {
                var item = ProcessToken(reader, objectType.GenericTypeArguments, serializer);
                return(dynamicConstructor(new[] { item }));
            }

            return(default);
        /// <summary>
        /// Reads the JSON representation of the object.
        /// </summary>
        /// <param name="reader">The <see cref="Utf8JsonReader"/> to read from.</param>
        /// <param name="typeToConvert">Type of the object.</param>
        /// <param name="options">The serializer options.</param>
        /// <returns>The object value.</returns>
        public override IValues Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (typeToConvert is null)
            {
                throw new ArgumentNullException(nameof(typeToConvert));
            }

            if (options is null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var dynamicConstructor = FastActivator.GetDynamicConstructor <IEnumerable <object> >(typeToConvert);

            if (reader.TokenType == JsonTokenType.StartArray)
            {
                var items = new List <object>();

                while (reader.Read())
                {
                    if (reader.TokenType == JsonTokenType.EndArray)
                    {
                        break;
                    }

                    if (reader.TokenType == JsonTokenType.Null)
                    {
                        continue;
                    }

                    var item = ProcessToken(ref reader, typeToConvert.GenericTypeArguments, options);
                    items.Add(item);
                }

                return((IValues)dynamicConstructor(items));
            }
            else if (reader.TokenType != JsonTokenType.Null)
            {
                var item = ProcessToken(ref reader, typeToConvert.GenericTypeArguments, options);
                return((IValues)dynamicConstructor(new[] { item }));
            }

            return(default);