namespace YandexMusic.API.Models.Feed.Event { public sealed class YFeedEventConverter : JsonConverter { private YFeedEventTitled GetEvent(JToken jObject) { YFeedEventTitled feedEvent; YFeedEventType type = jObject[jObject["typeForFrom"] != null ? "typeForFrom" : "type"] .ToObject(); switch (type) { case YFeedEventType.GenreTop: feedEvent = jObject.ToObject(); break; case YFeedEventType.NewAlbums: feedEvent = jObject.ToObject(); break; case YFeedEventType.NewAlbumsOfFavoriteGenre: feedEvent = jObject.ToObject(); break; case YFeedEventType.Notification: feedEvent = jObject.ToObject(); break; case YFeedEventType.Promotion: feedEvent = jObject.ToObject(); break; case YFeedEventType.RecentTrackLikeToTracks: feedEvent = jObject.ToObject(); break; case YFeedEventType.RecommendedArtistsWithArtistsFromHistory: feedEvent = jObject.ToObject(); break; case YFeedEventType.RecommendedSimilarArtists: feedEvent = jObject.ToObject(); break; case YFeedEventType.RecommendedSimilarGenre: feedEvent = jObject.ToObject(); break; case YFeedEventType.MissedTracksByArtist: case YFeedEventType.RareArtist: case YFeedEventType.RecommendedTracksByArtistFromHistory: feedEvent = jObject.ToObject(); break; case YFeedEventType.NewTracksOfFavoriteGenre: case YFeedEventType.TracksByGenre: feedEvent = jObject.ToObject(); break; case YFeedEventType.WellForgottenOldArtists: feedEvent = jObject.ToObject(); break; case YFeedEventType.NeverHeardFromLibrary: case YFeedEventType.WellForgottenOldTracks: feedEvent = jObject.ToObject(); break; default: feedEvent = jObject.ToObject(); break; } return feedEvent; } public override bool CanConvert(Type objectType) { return typeof(YFeedEventTitled).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(GetEvent) .ToList(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } public class YFeedEvent { public string Id { get; set; } public YFeedEventType Type { get; set; } } }