using System.Text.Json; using System.Text.Json.Serialization; using LootDumpProcessor.Storage; namespace LootDumpProcessor.Serializers.Json.Converters; public class NetJsonKeyConverter : JsonConverter { public override IKey? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { Dictionary values = new Dictionary(); while (reader.Read()) { var property = reader.GetString() ?? ""; reader.Read(); var value = reader.GetString() ?? ""; values.Add(property, value); if (values.Count == 2) break; } reader.Read(); if (!values.TryGetValue("type", out var type)) { throw new Exception("Key type was missing from json definition"); } if (!values.TryGetValue("serializedKey", out var serializedKey)) { throw new Exception("Key serializedKey was missing from json definition"); } AbstractKey key; switch (Enum.Parse(type)) { case KeyType.Subdivisioned: key = new SubdivisionedUniqueKey(serializedKey.Split("|")); break; case KeyType.Unique: key = new FlatUniqueKey(serializedKey.Split("|")); break; default: throw new Exception("Unknown key type used!"); } return key; } public override void Write(Utf8JsonWriter writer, IKey? value, JsonSerializerOptions options) { if (value != null) { var actualValue = (AbstractKey)value; writer.WriteStartObject(); // writer.WritePropertyName("type"); writer.WriteString("type", actualValue.GetKeyType().ToString()); // writer.WritePropertyName("serializedKey"); writer.WriteString("serializedKey", actualValue.SerializedKey); writer.WriteEndObject(); } else { writer.WriteStartObject(); writer.WriteEndObject(); } } }