From ccfbc47c719243ef2bd96b55e2bad640f67806ad Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 8 Mar 2023 21:43:47 +0100 Subject: [PATCH] Fix default variable value serialization issue --- ...rArrayConverter.cs => IntegerConverter.cs} | 0 .../JsonPrimitiveToStringConverter.cs | 43 +++++++++++++++++++ .../Converters/VariableConverter.cs | 4 +- 3 files changed, 46 insertions(+), 1 deletion(-) rename src/modules/Elsa.Workflows.Core/Serialization/Converters/{IntegerArrayConverter.cs => IntegerConverter.cs} (100%) create mode 100644 src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonPrimitiveToStringConverter.cs diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/IntegerArrayConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/IntegerConverter.cs similarity index 100% rename from src/modules/Elsa.Workflows.Core/Serialization/Converters/IntegerArrayConverter.cs rename to src/modules/Elsa.Workflows.Core/Serialization/Converters/IntegerConverter.cs diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonPrimitiveToStringConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonPrimitiveToStringConverter.cs new file mode 100644 index 000000000..694209159 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonPrimitiveToStringConverter.cs @@ -0,0 +1,43 @@ +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Elsa.Workflows.Core.Serialization.Converters; + +/// +/// Converts primitives to and from JSON strings. +/// +public class JsonPrimitiveToStringConverter : JsonConverter +{ + /// + public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case JsonTokenType.True: + return "True"; + case JsonTokenType.False: + return "False"; + case JsonTokenType.Number when reader.TryGetInt64(out var l): + return l.ToString(); + case JsonTokenType.Number: + return reader.GetDouble().ToString(CultureInfo.InvariantCulture); + case JsonTokenType.String when reader.TryGetDateTimeOffset(out var datetime): + return datetime.ToString(); + case JsonTokenType.String: + return reader.GetString()!; + default: + { + // Use JsonElement as fallback. + using var document = JsonDocument.ParseValue(ref reader); + return document.RootElement.Clone().ToString(); + } + } + } + + /// + public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + { + writer.WriteStringValue(value); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/VariableConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/VariableConverter.cs index d6f7c55d8..59bb353ee 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/VariableConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/VariableConverter.cs @@ -27,7 +27,9 @@ public class VariableConverter : JsonConverter /// public override Variable? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - var model = JsonSerializer.Deserialize(ref reader, options)!; + var newOptions = new JsonSerializerOptions(options); + newOptions.Converters.Add(new JsonPrimitiveToStringConverter()); + var model = JsonSerializer.Deserialize(ref reader, newOptions)!; var variable = Map(model); return variable;