using YandexMusic.API.Models.Landing.Entity.Entities; namespace YandexMusic.API.Models.Landing.Entity { public sealed class YLandingEntityConverter : JsonConverter { private YLandingEntity GetEntity(JToken jObject) { YLandingEntity entity; try { YLandingEntityType type = jObject["type"].ToObject(); switch (type) { case YLandingEntityType.Album: entity = jObject.ToObject(); break; case YLandingEntityType.ChartItem: entity = jObject.ToObject(); break; case YLandingEntityType.PersonalPlaylist: entity = jObject.ToObject(); break; case YLandingEntityType.PlayContext: entity = jObject.ToObject(); break; case YLandingEntityType.Playlist: entity = jObject.ToObject(); break; case YLandingEntityType.Podcast: entity = jObject.ToObject(); break; case YLandingEntityType.Promotion: entity = jObject.ToObject(); break; case YLandingEntityType.Category: entity = jObject.ToObject(); break; case YLandingEntityType.Station: entity = jObject.ToObject(); break; case YLandingEntityType.MenuItemAlbum: case YLandingEntityType.MenuItemPlaylist: entity = jObject.ToObject(); break; case YLandingEntityType.ClientWidget: entity = jObject.ToObject(); break; default: entity = jObject.ToObject(); break; } } catch (Exception ex) { throw new Exception($"Ошибка десериализации типа \"{jObject["type"]}\".", ex); } return entity; } public override bool CanConvert(Type objectType) { return typeof(YLandingEntity).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; return JArray.Load(reader) .Select(GetEntity) .ToList(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } public abstract class YLandingEntity { public string Id { get; set; } public YLandingEntityType Type { get; set; } } }