45 lines
1.7 KiB
C#
45 lines
1.7 KiB
C#
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using System;
|
|
|
|
namespace PrizeSystem
|
|
{
|
|
public class PrizeConverter : JsonConverter<Prize>
|
|
{
|
|
public override Prize ReadJson(JsonReader reader, Type objectType, Prize existingValue, bool hasExistingValue, JsonSerializer serializer)
|
|
{
|
|
var jsonObject = JObject.Load(reader);
|
|
|
|
var prizeTypeToken = jsonObject["PrizeType"];
|
|
if (prizeTypeToken == null)
|
|
throw new JsonSerializationException("Missing PrizeType field");
|
|
|
|
var prizeType = prizeTypeToken.ToObject<PrizeType>();
|
|
|
|
// Создаем объект нужного типа
|
|
Prize prize = prizeType switch
|
|
{
|
|
PrizeType.None => new EmptyPrize(),
|
|
PrizeType.Qr => new QrPrize(""), // временный, заполним ниже
|
|
PrizeType.VitrinaBox => new VitrinaPrize(Array.Empty<int>()),
|
|
PrizeType.Ticket or PrizeType.Marbles or PrizeType.Hopper =>
|
|
new CountablePrize(CountablePrizeType.Ticket, 0), // временный
|
|
_ => throw new NotSupportedException($"Unknown prize type: {prizeType}")
|
|
};
|
|
|
|
// Заполняем поля через стандартную десериализацию
|
|
using (var subReader = jsonObject.CreateReader())
|
|
{
|
|
serializer.Populate(subReader, prize);
|
|
}
|
|
|
|
return prize;
|
|
}
|
|
|
|
public override void WriteJson(JsonWriter writer, Prize value, JsonSerializer serializer)
|
|
{
|
|
var jsonObject = JObject.FromObject(value, serializer);
|
|
jsonObject.WriteTo(writer);
|
|
}
|
|
}
|
|
} |