diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 2bc7c34..85b0e57 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -515,7 +515,7 @@ namespace AssetStudio var jsonOptions = new JsonSerializerOptions { - Converters = { new JsonConverterHelper.ByteArrayConverter(), new JsonConverterHelper.PPtrConverter() }, + Converters = { new JsonConverterHelper.ByteArrayConverter(), new JsonConverterHelper.PPtrConverter(), new JsonConverterHelper.KVPConverter() }, NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals, PropertyNameCaseInsensitive = true, IncludeFields = true, diff --git a/AssetStudio/JsonConverterHelpers/KVPConverter.cs b/AssetStudio/JsonConverterHelpers/KVPConverter.cs new file mode 100644 index 0000000..120e2c0 --- /dev/null +++ b/AssetStudio/JsonConverterHelpers/KVPConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AssetStudio +{ + public static partial class JsonConverterHelper + { + public class KVPConverter : JsonConverterFactory + { + public override bool CanConvert(Type typeToConvert) + { + if (!typeToConvert.IsGenericType) + return false; + + var generic = typeToConvert.GetGenericTypeDefinition(); + return generic == typeof(KeyValuePair<,>); + } + + public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options) + { + var kvpArgs = type.GetGenericArguments(); + return (JsonConverter)Activator.CreateInstance(typeof(KVPConverter<,>).MakeGenericType(kvpArgs)); + } + } + + private class KVPConverter : JsonConverter> + { + public override KeyValuePair Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + //startKvpObject + reader.Read(); //propName + reader.Read(); //keyType + var key = reader.TokenType == JsonTokenType.StartObject + ? JsonSerializer.Deserialize>(ref reader).Values.First() + : JsonSerializer.Deserialize(ref reader); + reader.Read(); //propName + reader.Read(); //startObject + var value = JsonSerializer.Deserialize(ref reader, options); + reader.Read(); //endKvpObject + + return new KeyValuePair(key, value); + } + + public override void Write(Utf8JsonWriter writer, KeyValuePair value, JsonSerializerOptions options) + { + throw new NotImplementedException(); + } + } + } +}