diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/TypeJsonConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/TypeJsonConverter.cs index 24ff2dfcf..816b5fb5b 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/TypeJsonConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/TypeJsonConverter.cs @@ -31,13 +31,21 @@ public class TypeJsonConverter : JsonConverter { var typeAlias = reader.GetString()!; - // Handle collection types. + // Handle array types. if (typeAlias.EndsWith("[]")) { - var elementTypeAlias = typeAlias[..^"[]".Length]; + var elementTypeAlias = typeAlias[..^2]; var elementType = _wellKnownTypeRegistry.TryGetType(elementTypeAlias, out var t) ? t : Type.GetType(elementTypeAlias)!; return elementType.MakeArrayType(); } + + // Handle collection types. + if (typeAlias.EndsWith("()")) + { + var elementTypeAlias = typeAlias[..^"()".Length]; + var elementType = _wellKnownTypeRegistry.TryGetType(elementTypeAlias, out var t) ? t : Type.GetType(elementTypeAlias)!; + return typeof(List<>).MakeGenericType(elementType); + } return _wellKnownTypeRegistry.TryGetType(typeAlias, out var type) ? type : Type.GetType(typeAlias); } @@ -45,6 +53,15 @@ public class TypeJsonConverter : JsonConverter /// public override void Write(Utf8JsonWriter writer, Type value, JsonSerializerOptions options) { + // Handle array types. + if (value.IsArray) + { + var elementType = value.GetElementType()!; + var elementTypeAlias = _wellKnownTypeRegistry.TryGetAlias(elementType, out var elementTypeAliasValue) ? elementTypeAliasValue : elementType.GetSimpleAssemblyQualifiedName(); + writer.WriteStringValue($"{elementTypeAlias}[]"); + return; + } + // Handle collection types. if (value is { IsGenericType: true, GenericTypeArguments.Length: 1 }) { @@ -53,7 +70,7 @@ public class TypeJsonConverter : JsonConverter if (typedEnumerable.IsAssignableFrom(value) && _wellKnownTypeRegistry.TryGetAlias(elementType, out var elementTypeAlias)) { - writer.WriteStringValue($"{elementTypeAlias}[]"); + writer.WriteStringValue($"{elementTypeAlias}()"); return; } } diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs index 1a6ff38d5..f4a853f28 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs @@ -74,7 +74,8 @@ public class SerializationTests(ITestOutputHelper testOutputHelper) { var dict = new Dictionary { - { "Content", new List() + { + "Content", new List() { new() { @@ -94,9 +95,10 @@ public class SerializationTests(ITestOutputHelper testOutputHelper) { var dict = new Dictionary { - { "Content", new List + { + "Content", new List { - Guid.NewGuid() + Guid.NewGuid() } } }; @@ -106,6 +108,24 @@ public class SerializationTests(ITestOutputHelper testOutputHelper) Assert.Equal(typeof(List), result.GetType()); } + [Fact] + public void RoundtripPrimitiveArrays() + { + var dict = new Dictionary + { + { + "Content", new[] + { + Guid.NewGuid() + } + } + }; + var jsonSerialized = SerializeUsingPayloadSerializer(dict); + var transformationModel = DeSerializeDictionaryUsingPayloadSerializer(jsonSerialized); + var result = transformationModel["Content"]; + Assert.Equal(typeof(Guid[]), result.GetType()); + } + private string SerializeUsingPayloadSerializer(object obj) { var payloadSerializer = _services.GetRequiredService(); @@ -134,10 +154,11 @@ public class SerializationTests(ITestOutputHelper testOutputHelper) var dict = new Dictionary { - { "StatusCode", "Created" }, - { "Content",isArray ? - (type == typeof(JArray)? JArray.Parse(jsonContent):JsonArray.Parse(jsonContent)): - (type == typeof(JObject)? JObject.Parse(jsonContent):JsonObject.Parse(jsonContent)) + { + "StatusCode", "Created" + }, + { + "Content", isArray ? (type == typeof(JArray) ? JArray.Parse(jsonContent) : JsonArray.Parse(jsonContent)) : (type == typeof(JObject) ? JObject.Parse(jsonContent) : JsonObject.Parse(jsonContent)) } }; return dict;