Обнновлено до .net10
This commit is contained in:
@@ -1,71 +1,35 @@
|
||||
namespace YandexMusic.API.Models.Common.Cover
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace YandexMusic.API.Models.Common.Cover;
|
||||
|
||||
public class YCoverConverter : JsonConverter<YCover>
|
||||
{
|
||||
public sealed class YCoverConverter : JsonConverter
|
||||
public override YCover? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
public override bool CanConvert(Type objectType)
|
||||
if (reader.TokenType != JsonTokenType.StartObject) return null;
|
||||
using var doc = JsonDocument.ParseValue(ref reader);
|
||||
var root = doc.RootElement;
|
||||
var type = root.TryGetProperty("type", out var t) ? t.GetString() : null;
|
||||
if (root.TryGetProperty("error", out _)) type = "error";
|
||||
|
||||
return type switch
|
||||
{
|
||||
return typeof(YCover).IsAssignableFrom(objectType);
|
||||
}
|
||||
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||
{
|
||||
if (reader.TokenType == JsonToken.Null)
|
||||
return null;
|
||||
|
||||
JObject jObject = JObject.Load(reader);
|
||||
YCover cover;
|
||||
|
||||
try
|
||||
{
|
||||
// Фиктивный тип, т.к. у такой обложки нет поля с типом
|
||||
if (jObject["type"] == null)
|
||||
jObject.Add("type", "color");
|
||||
|
||||
YCoverType type = jObject["error"] != null
|
||||
? YCoverType.Error
|
||||
: jObject["type"].ToObject<YCoverType>();
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case YCoverType.Error:
|
||||
cover = jObject.ToObject<YCoverError>();
|
||||
break;
|
||||
case YCoverType.Color:
|
||||
cover = jObject.ToObject<YCoverColor>();
|
||||
break;
|
||||
case YCoverType.FromAlbumCover:
|
||||
case YCoverType.FromArtistPhotos:
|
||||
cover = jObject.ToObject<YCoverImage>();
|
||||
break;
|
||||
case YCoverType.Pic:
|
||||
cover = jObject.ToObject<YCoverPic>();
|
||||
break;
|
||||
case YCoverType.Mosaic:
|
||||
cover = jObject.ToObject<YCoverMosaic>();
|
||||
break;
|
||||
default:
|
||||
cover = jObject.ToObject<YCover>();
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"Ошибка десериализации типа \"{objectType.Name}\".", ex);
|
||||
}
|
||||
|
||||
return cover;
|
||||
}
|
||||
|
||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||
{
|
||||
JObject cover = JObject.FromObject(value, serializer);
|
||||
|
||||
cover.WriteTo(writer);
|
||||
}
|
||||
"color" => JsonSerializer.Deserialize<YCoverColor>(root.GetRawText(), options),
|
||||
"error" => JsonSerializer.Deserialize<YCoverError>(root.GetRawText(), options),
|
||||
"from-artist-photos" or "from-album-cover" => JsonSerializer.Deserialize<YCoverImage>(root.GetRawText(), options),
|
||||
"pic" => JsonSerializer.Deserialize<YCoverPic>(root.GetRawText(), options),
|
||||
"mosaic" => JsonSerializer.Deserialize<YCoverMosaic>(root.GetRawText(), options),
|
||||
_ => JsonSerializer.Deserialize<YCover>(root.GetRawText(), options)
|
||||
};
|
||||
}
|
||||
|
||||
public class YCover
|
||||
{
|
||||
public YCoverType Type { get; set; }
|
||||
}
|
||||
public override void Write(Utf8JsonWriter writer, YCover value, JsonSerializerOptions options)
|
||||
=> JsonSerializer.Serialize(writer, value, options);
|
||||
}
|
||||
|
||||
[JsonConverter(typeof(YCoverConverter))]
|
||||
public class YCover
|
||||
{
|
||||
public YCoverType Type { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user