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 = Enum.Parse(type) switch { KeyType.Subdivisioned => new SubdivisionedUniqueKey(serializedKey.Split("|")), KeyType.Unique => new FlatUniqueKey(serializedKey.Split("|")), _ => 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(); } } }