using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; namespace PrizeSystem { public class PrizeConverter : JsonConverter { 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(); // Создаем объект нужного типа Prize prize = prizeType switch { PrizeType.None => new EmptyPrize(), PrizeType.Qr => new QrPrize(""), // временный, заполним ниже PrizeType.VitrinaBox => new VitrinaPrize(Array.Empty()), 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); } } }