From 494d6e7f43ac8aa375a6125c8a06ac4189a01302 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 10 Oct 2024 10:18:27 +0200 Subject: [PATCH] Refactor polymorphic JSON deserialization. Simplify the handling of `JsonNode` parsing and improve type-checking. Added a guard clause in `ReadType` method to handle non-object JSON token types, ensuring safer type parsing. --- .../Converters/PolymorphicObjectConverter.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs index 49eeeb940..f8121b24d 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs @@ -93,9 +93,9 @@ public class PolymorphicObjectConverter(IWellKnownTypeRegistry wellKnownTypeRegi if (isDictionary) { // Remove the _type property name from the JSON, if any. - var parsedModel = (JsonObject)JsonNode.Parse(ref reader)!; - parsedModel.Remove(TypePropertyName); - return parsedModel.Deserialize(targetType, newOptions)!; + var parsedNode = JsonNode.Parse(ref reader)!; + if (parsedNode is JsonObject parsedModel) parsedModel.Remove(TypePropertyName); + return parsedNode.Deserialize(targetType, newOptions)!; } var isCollection = typeof(ICollection).IsAssignableFrom(targetType); @@ -247,7 +247,7 @@ public class PolymorphicObjectConverter(IWellKnownTypeRegistry wellKnownTypeRegi { var typeOptions = newOptions.Clone(); typeOptions.Converters.RemoveWhere(c => c.GetType() != typeof(TypeJsonConverter)); - + if (typeOptions.Converters.Any()) { var typeValue = JsonSerializer.Serialize(type, typeOptions).Trim('"'); @@ -265,6 +265,9 @@ public class PolymorphicObjectConverter(IWellKnownTypeRegistry wellKnownTypeRegi private Type? ReadType(Utf8JsonReader reader) { + if (reader.TokenType != JsonTokenType.StartObject) + return null; + reader.Read(); // Move to the first token inside the object. string? typeName = null;