diff --git a/Source/Engine/Content/JsonAssetReference.cs b/Source/Engine/Content/JsonAssetReference.cs index a3a17fe2b..59cf55cc1 100644 --- a/Source/Engine/Content/JsonAssetReference.cs +++ b/Source/Engine/Content/JsonAssetReference.cs @@ -12,6 +12,7 @@ namespace FlaxEngine #if FLAX_EDITOR [CustomEditor(typeof(FlaxEditor.CustomEditors.Editors.AssetRefEditor))] #endif + [Newtonsoft.Json.JsonConverter(typeof(Json.JsonAssetReferenceConverter))] public struct JsonAssetReference : IComparable, IComparable>, IEquatable> { /// diff --git a/Source/Engine/Serialization/JsonConverters.cs b/Source/Engine/Serialization/JsonConverters.cs index c7d937abc..5be6a6a53 100644 --- a/Source/Engine/Serialization/JsonConverters.cs +++ b/Source/Engine/Serialization/JsonConverters.cs @@ -429,6 +429,60 @@ namespace FlaxEngine.Json } } + internal sealed class JsonAssetReferenceConverter : JsonConverter + { + /// + public override unsafe void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) + { + var asset = (JsonAsset)value.GetType().GetField("Asset").GetValue(value); + var id = asset?.ID ?? Guid.Empty; + writer.WriteValue(JsonSerializer.GetStringID(&id)); + } + + /// + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) + { + var result = Activator.CreateInstance(objectType); + if (reader.TokenType == JsonToken.String) + { + JsonSerializer.ParseID((string)reader.Value, out var id); + var asset = Content.LoadAsync(id); + objectType.GetField("Asset").SetValue(result, asset); + } + else if (reader.TokenType == JsonToken.StartObject) + { + // [Deprecated on 26.07.2024, expires on 26.07.2026] + while (reader.Read() && reader.TokenType != JsonToken.EndObject) + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + { + var propertyName = (string)reader.Value; + reader.Read(); + if (propertyName == "Asset" && reader.TokenType == JsonToken.String) + { + JsonSerializer.ParseID((string)reader.Value, out var id); + var asset = Content.LoadAsync(id); + objectType.GetField("Asset").SetValue(result, asset); + } + + break; + } + } + } + } + + return result; + } + + /// + public override bool CanConvert(Type objectType) + { + return objectType.Name.StartsWith("JsonAssetReference"); + } + } + /* /// /// Serialize Guid values using `N` format