public override Album Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType is not JsonTokenType.StartObject)
            {
                throw new JsonException();
            }

            var copyrightArrayConverter        = options.GetConverter <CopyrightArray>();
            var countryCodeArrayConverter      = options.GetConverter <CountryCodeArray>();
            var externalIdsConverter           = options.GetConverter <ExternalIds>();
            var externalUrlsConverter          = options.GetConverter <ExternalUrls>();
            var imageArrayConverter            = options.GetConverter <ImageArray>();
            var simplifiedArtistArrayConverter = options.GetConverter <SimplifiedArtistArray>();
            var simplifiedTrackPagingConverter = options.GetConverter <Paging <SimplifiedTrack> >();
            var stringArrayConverter           = options.GetConverter <StringArray>();
            var uriConverter = options.GetConverter <Uri>();

            string                   id                   = string.Empty;
            Uri                      uri                  = null !;
            Uri                      href                 = null !;
            string                   name                 = string.Empty;
            AlbumType                type                 = default;
            ImageArray               images               = Array.Empty <Image>();
            SimplifiedArtistArray    artists              = Array.Empty <SimplifiedArtist>();
            DateTime                 releaseDate          = default;
            ReleaseDatePrecision     releaseDatePrecision = default;
            CountryCodeArray         availableMarkets     = Array.Empty <CountryCode>();
            CopyrightArray           copyrights           = Array.Empty <Copyright>();
            ExternalIds              externalIds          = null !;
            ExternalUrls             externalUrls         = null !;
            StringArray              genres               = Array.Empty <string>();
            string                   label                = string.Empty;
            int                      popularity           = default;
            Paging <SimplifiedTrack> tracks               = null !;

            while (reader.Read())
            {
                if (reader.TokenType is JsonTokenType.EndObject)
                {
                    break;
                }

                if (reader.TokenType is not JsonTokenType.PropertyName)
                {
                    throw new JsonException();
                }

                var propertyName = reader.GetString();

                reader.Read(); // Read to next token.

                switch (propertyName)
                {
                case "id":
                    id = reader.GetString() !;
                    break;

                case "uri":
                    uri = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "href":
                    href = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "name":
                    name = reader.GetString() !;
                    break;

                case "album_type":
                    type = AlbumTypeConverter.FromSpotifyString(reader.GetString() !);
                    break;

                case "images":
                    images = imageArrayConverter.Read(ref reader, typeof(ImageArray), options) !;
                    break;

                case "artists":
                    artists = simplifiedArtistArrayConverter.Read(ref reader, typeof(SimplifiedArtistArray), options) !;
                    break;

                case "release_date":
                    releaseDate = reader.GetReleaseDate();
                    break;

                case "release_date_precision":
                    releaseDatePrecision = ReleaseDatePrecisionConverter.FromSpotifyString(reader.GetString() !);
                    break;

                case "tracks":
                    tracks = simplifiedTrackPagingConverter.Read(ref reader, typeof(Paging <SimplifiedTrack>), options) !;
                    break;

                case "genres":
                    genres = stringArrayConverter.Read(ref reader, typeof(StringArray), options) !;
                    break;

                case "popularity":
                    popularity = reader.GetInt32();
                    break;

                case "available_markets":
                    availableMarkets = countryCodeArrayConverter.Read(ref reader, typeof(CountryCodeArray), options) !;
                    break;

                case "label":
                    label = reader.GetString() !;
                    break;

                case "copyrights":
                    copyrights = copyrightArrayConverter.Read(ref reader, typeof(CopyrightArray), options) !;
                    break;

                case "external_ids":
                    externalIds = externalIdsConverter.Read(ref reader, typeof(ExternalIds), options) !;
                    break;

                case "external_urls":
                    externalUrls = externalUrlsConverter.Read(ref reader, typeof(ExternalUrls), options) !;
                    break;

                default:
                    reader.Skip();
                    break;
                }
            }

            return(new(
                       id,
                       uri,
                       href,
                       name,
                       type,
                       images,
                       artists,
                       releaseDate,
                       releaseDatePrecision,
                       tracks,
                       genres,
                       popularity,
                       availableMarkets,
                       label,
                       copyrights,
                       externalIds,
                       externalUrls));
        }
        public override Track Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType is not JsonTokenType.StartObject)
            {
                throw new JsonException();
            }

            var countryCodeArrayConverter      = options.GetConverter <CountryCodeArray>();
            var externalIdsConverter           = options.GetConverter <ExternalIds>();
            var externalUrlsConverter          = options.GetConverter <ExternalUrls>();
            var simplifiedAlbumConverter       = options.GetConverter <SimplifiedAlbum>();
            var simplifiedArtistArrayConverter = options.GetConverter <SimplifiedArtistArray>();
            var uriConverter = options.GetConverter <Uri>();

            string                id               = string.Empty;
            Uri                   uri              = null !;
            Uri                   href             = null !;
            string                name             = string.Empty;
            SimplifiedAlbum       album            = null !;
            SimplifiedArtistArray artists          = Array.Empty <SimplifiedArtist>();
            int                   duration         = default;
            int                   trackNumber      = default;
            int                   discNumber       = default;
            bool                  isExplicit       = default;
            bool                  isLocal          = default;
            CountryCodeArray      availableMarkets = Array.Empty <CountryCode>();
            int                   popularity       = default;
            string                previewUrl       = string.Empty;
            ExternalIds           externalIds      = null !;
            ExternalUrls          externalUrls     = null !;

            while (reader.Read())
            {
                if (reader.TokenType is JsonTokenType.EndObject)
                {
                    break;
                }

                if (reader.TokenType is not JsonTokenType.PropertyName)
                {
                    throw new JsonException();
                }

                var propertyName = reader.GetString();

                reader.Read(); // Read to next token.

                switch (propertyName)
                {
                case "id":
                    id = reader.GetString() !;
                    break;

                case "uri":
                    uri = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "href":
                    href = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "name":
                    name = reader.GetString() !;
                    break;

                case "album":
                    album = simplifiedAlbumConverter.Read(ref reader, typeof(SimplifiedAlbum), options) !;
                    break;

                case "artists":
                    artists = simplifiedArtistArrayConverter.Read(ref reader, typeof(SimplifiedArtistArray), options) !;
                    break;

                case "duration_ms":
                    duration = reader.GetInt32();
                    break;

                case "track_number":
                    trackNumber = reader.GetInt32();
                    break;

                case "disc_number":
                    discNumber = reader.GetInt32();
                    break;

                case "explicit":
                    isExplicit = reader.GetBoolean();
                    break;

                case "is_local":
                    isLocal = reader.GetBoolean();
                    break;

                case "available_markets":
                    availableMarkets = countryCodeArrayConverter.Read(ref reader, typeof(CountryCodeArray), options) !;
                    break;

                case "popularity":
                    popularity = reader.GetInt32();
                    break;

                case "preview_url":
                    previewUrl = reader.GetString() !;
                    break;

                case "external_ids":
                    externalIds = externalIdsConverter.Read(ref reader, typeof(ExternalIds), options) !;
                    break;

                case "external_urls":
                    externalUrls = externalUrlsConverter.Read(ref reader, typeof(ExternalUrls), options) !;
                    break;

                default:
                    reader.Skip();
                    break;
                }
            }

            return(new(
                       id,
                       uri,
                       href,
                       name,
                       album,
                       artists,
                       duration,
                       discNumber,
                       trackNumber,
                       isExplicit,
                       isLocal,
                       availableMarkets,
                       popularity,
                       previewUrl,
                       externalIds,
                       externalUrls));
        }
        public override SimplifiedAlbum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType is not JsonTokenType.StartObject)
            {
                throw new JsonException();
            }

            var countryCodeArrayConverter      = options.GetConverter <CountryCodeArray>();
            var externalUrlsConverter          = options.GetConverter <ExternalUrls>();
            var imageArrayConverter            = options.GetConverter <ImageArray>();
            var simplifiedArtistArrayConverter = options.GetConverter <SimplifiedArtistArray>();
            var uriConverter = options.GetConverter <Uri>();

            string                id                   = string.Empty;
            Uri                   uri                  = null !;
            Uri                   href                 = null !;
            string                name                 = string.Empty;
            AlbumType             type                 = default;
            AlbumGroups?          group                = null;
            ImageArray            images               = null !;
            SimplifiedArtistArray artists              = null !;
            DateTime              releaseDate          = default;
            ReleaseDatePrecision  releaseDatePrecision = default;
            CountryCodeArray      availableMarkets     = null !;
            ExternalUrls          externalUrls         = null !;

            while (reader.Read())
            {
                if (reader.TokenType is JsonTokenType.EndObject)
                {
                    break;
                }

                if (reader.TokenType is not JsonTokenType.PropertyName)
                {
                    throw new JsonException();
                }

                var propertyName = reader.GetString();

                reader.Read(); // Read to next token.

                switch (propertyName)
                {
                case "id":
                    id = reader.GetString() !;
                    break;

                case "uri":
                    uri = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "href":
                    href = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "name":
                    name = reader.GetString() !;
                    break;

                case "album_type":
                    type = AlbumTypeConverter.FromSpotifyString(reader.GetString() !.ToLower());
                    break;

                case "album_group":
                    group = AlbumGroupConverter.FromSpotifyString(reader.GetString() !.ToLower());
                    break;

                case "images":
                    images = imageArrayConverter.Read(ref reader, typeof(ImageArray), options) !;
                    break;

                case "artists":
                    artists = simplifiedArtistArrayConverter.Read(ref reader, typeof(SimplifiedArtistArray), options) !;
                    break;

                case "release_date":
                    var date = reader.GetString() !.Split('-');
                    releaseDate = new(
                        date.Length > 0 ? int.Parse(date[0]) : 1,
                        date.Length > 1 ? int.Parse(date[1]) : 1,
                        date.Length > 2 ? int.Parse(date[2]) : 1);
                    break;

                case "release_date_precision":
                    releaseDatePrecision = ReleaseDatePrecisionConverter.FromSpotifyString(reader.GetString() !);
                    break;

                case "available_markets":
                    availableMarkets = countryCodeArrayConverter.Read(ref reader, typeof(CountryCodeArray), options) !;
                    break;

                case "external_urls":
                    externalUrls = externalUrlsConverter.Read(ref reader, typeof(ExternalUrls), options) !;
                    break;

                default:
                    reader.Skip();
                    break;
                }
            }

            return(new(
                       id,
                       uri,
                       href,
                       name,
                       type,
                       group,
                       images,
                       artists,
                       releaseDate,
                       releaseDatePrecision,
                       availableMarkets,
                       externalUrls));
        }