LootDumpProcessor/Serializers/Json/Converters/NetJsonKeyConverter.cs

62 lines
2.0 KiB
C#
Raw Normal View History

using System.Text.Json;
2023-08-12 19:08:38 +01:00
using System.Text.Json.Serialization;
using LootDumpProcessor.Storage;
2023-08-12 19:08:38 +01:00
namespace LootDumpProcessor.Serializers.Json.Converters;
2023-08-12 19:08:38 +01:00
public class NetJsonKeyConverter : JsonConverter<IKey?>
{
public override IKey? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
Dictionary<string, string> values = new Dictionary<string, string>();
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<KeyType>(type) switch
2023-08-12 19:08:38 +01:00
{
KeyType.Subdivisioned => new SubdivisionedUniqueKey(serializedKey.Split("|")),
KeyType.Unique => new FlatUniqueKey(serializedKey.Split("|")),
_ => throw new Exception("Unknown key type used!")
};
2023-08-12 19:08:38 +01:00
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();
}
}
}