using YandexMusic.API.Models.Common; using YandexMusic.API.Models.Search.Album; using YandexMusic.API.Models.Search.Artist; using YandexMusic.API.Models.Search.Playlist; using YandexMusic.API.Models.Search.Track; using YandexMusic.API.Models.Search.Video; namespace YandexMusic.API.Models.Search { /// /// Конвертер для поля Result /// internal class YSearchBestConverter : JsonConverter { public override bool CanConvert(Type objectType) { throw new NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; JObject obj = JObject.Load(reader); JsonObjectContract contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(objectType); YSearchBest best = existingValue as YSearchBest ?? (YSearchBest)contract.DefaultCreator(); best.Type = (YSearchType)Enum.Parse(typeof(YSearchType), obj["type"].ToString(), true); switch (best.Type) { case YSearchType.Track: best.Result = JsonConvert.DeserializeObject(obj["result"].ToString()); break; case YSearchType.Album: best.Result = JsonConvert.DeserializeObject(obj["result"].ToString()); break; case YSearchType.Artist: best.Result = JsonConvert.DeserializeObject(obj["result"].ToString()); break; case YSearchType.Playlist: best.Result = JsonConvert.DeserializeObject(obj["result"].ToString()); break; case YSearchType.PodcastEpisode: best.Result = JsonConvert.DeserializeObject(obj["result"].ToString()); break; case YSearchType.Video: best.Result = JsonConvert.DeserializeObject(obj["result"].ToString()); break; } return best; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanWrite => false; } [JsonConverter(typeof(YSearchBestConverter))] public class YSearchBest { public dynamic Result { get; set; } public YSearchType Type { get; set; } } }