using System.Text.Json; using System.Text.Json.Serialization; using YandexMusic.API.Models.Landing.Entity.Entities; namespace YandexMusic.API.Models.Landing.Entity; /// Конвертер для сущностей лендинга (десериализация в конкретные типы на основе поля type). public class YLandingEntityConverter : JsonConverter> { public override List Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartArray) throw new JsonException("Ожидается массив сущностей"); var entities = new List(); while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndArray) break; if (reader.TokenType != JsonTokenType.StartObject) throw new JsonException("Ожидается объект сущности"); using var doc = JsonDocument.ParseValue(ref reader); var root = doc.RootElement; var typeProp = root.GetProperty("type"); var typeStr = typeProp.GetString(); if (!Enum.TryParse(typeStr, true, out var entityType)) throw new JsonException($"Неизвестный тип сущности: {typeStr}"); YLandingEntity? entity = null; var rawText = root.GetRawText(); switch (entityType) { case YLandingEntityType.Album: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.ChartItem: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.PersonalPlaylist: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.PlayContext: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.Playlist: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.Podcast: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.Promotion: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.Category: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.Station: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.MenuItemAlbum: case YLandingEntityType.MenuItemPlaylist: entity = JsonSerializer.Deserialize(rawText, options); break; case YLandingEntityType.ClientWidget: entity = JsonSerializer.Deserialize(rawText, options); break; default: entity = JsonSerializer.Deserialize(rawText, options); break; } if (entity != null) entities.Add(entity); } return entities; } public override void Write(Utf8JsonWriter writer, List value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, options); } }