// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; namespace ManagementConsoleBackend.ManagementService.Data { public class PlayerProfileAttributeSpecifiedConcreteClassConverter : DefaultContractResolver { protected override JsonConverter ResolveContractConverter(Type objectType) { if (typeof(PlayerProfileAttribute).IsAssignableFrom(objectType) && !objectType.IsAbstract) return null; // pretend TableSortRuleConvert is not specified (thus avoiding a stack overflow) return base.ResolveContractConverter(objectType); } } public class PlayerProfileAttributeConverter : JsonConverter { static JsonSerializerSettings SpecifiedSubclassConversion = new JsonSerializerSettings() { ContractResolver = new PlayerProfileAttributeSpecifiedConcreteClassConverter() }; public override bool CanConvert(Type objectType) { return (objectType == typeof(PlayerProfileAttribute)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); switch (jo["AttributeType"].Value()) { case "S": return JsonConvert.DeserializeObject(jo.ToString(), SpecifiedSubclassConversion); case "SL": if (jo["ValueType"].Value() == "randomStringList") { return JsonConvert.DeserializeObject(jo.ToString(), SpecifiedSubclassConversion); } else { return JsonConvert.DeserializeObject(jo.ToString(), SpecifiedSubclassConversion); } case "SDM": return JsonConvert.DeserializeObject(jo.ToString(), SpecifiedSubclassConversion); case "N": if (jo["ValueType"].Value() == "randomInteger") { return JsonConvert.DeserializeObject(jo.ToString(), SpecifiedSubclassConversion); } else if (jo["ValueType"].Value() == "randomDouble") { return JsonConvert.DeserializeObject(jo.ToString(), SpecifiedSubclassConversion); } else if (jo["ValueType"].Value() == "value") { return JsonConvert.DeserializeObject(jo.ToString(), SpecifiedSubclassConversion); } break; default: throw new Exception(); } throw new NotImplementedException(); } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); // won't be called because CanWrite returns false } } }