From 4f2baec322b8d97f633f9bec66c32f462e0e8fa5 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 26 Apr 2024 15:29:16 +0200 Subject: [PATCH] Reuse JsonSerializerOptions (#5283) --- .../Expressions/ObjectExpressionHandler.cs | 28 +++++++++++-------- .../Extensions/VariableExtensions.cs | 24 +++++++++------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Expressions/ObjectExpressionHandler.cs b/src/modules/Elsa.Workflows.Core/Expressions/ObjectExpressionHandler.cs index 502f50503..8afb21bf5 100644 --- a/src/modules/Elsa.Workflows.Core/Expressions/ObjectExpressionHandler.cs +++ b/src/modules/Elsa.Workflows.Core/Expressions/ObjectExpressionHandler.cs @@ -7,6 +7,7 @@ using Elsa.Common.Converters; using Elsa.Expressions.Contracts; using Elsa.Expressions.Helpers; using Elsa.Expressions.Models; +using Elsa.Extensions; using JetBrains.Annotations; namespace Elsa.Workflows.Expressions; @@ -17,6 +18,20 @@ namespace Elsa.Workflows.Expressions; [UsedImplicitly] public class ObjectExpressionHandler : IExpressionHandler { + private JsonSerializerOptions? _serializerOptions; + + private JsonSerializerOptions SerializerOptions => + _serializerOptions ??= new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + ReferenceHandler = ReferenceHandler.Preserve, + PropertyNameCaseInsensitive = true, + Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) + }.WithConverters( + new IntegerJsonConverter(), + new DecimalJsonConverter(), + new JsonStringEnumConverter()); + /// [RequiresUnreferencedCode("The type is not known at compile time.")] public ValueTask EvaluateAsync(Expression expression, Type returnType, ExpressionExecutionContext context, ExpressionEvaluatorOptions options) @@ -26,18 +41,7 @@ public class ObjectExpressionHandler : IExpressionHandler if (string.IsNullOrWhiteSpace(value)) return ValueTask.FromResult(default(object?)); - var serializerOptions = new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - ReferenceHandler = ReferenceHandler.Preserve, - PropertyNameCaseInsensitive = true, - Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) - }; - serializerOptions.Converters.Add(new IntegerJsonConverter()); - serializerOptions.Converters.Add(new DecimalJsonConverter()); - serializerOptions.Converters.Add(new JsonStringEnumConverter()); - - var converterOptions = new ObjectConverterOptions(serializerOptions); + var converterOptions = new ObjectConverterOptions(SerializerOptions); var model = value.ConvertTo(returnType, converterOptions); return ValueTask.FromResult(model); } diff --git a/src/modules/Elsa.Workflows.Core/Extensions/VariableExtensions.cs b/src/modules/Elsa.Workflows.Core/Extensions/VariableExtensions.cs index 880d22970..d40876542 100644 --- a/src/modules/Elsa.Workflows.Core/Extensions/VariableExtensions.cs +++ b/src/modules/Elsa.Workflows.Core/Extensions/VariableExtensions.cs @@ -17,6 +17,19 @@ namespace Elsa.Extensions; /// public static class VariableExtensions { + private static JsonSerializerOptions? _serializerOptions; + + private static JsonSerializerOptions SerializerOptions => + _serializerOptions ??= new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + ReferenceHandler = ReferenceHandler.Preserve, + PropertyNameCaseInsensitive = true, + Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) + }.WithConverters( + new JsonStringEnumConverter(), + new ExpandoObjectConverterFactory()); + /// /// Configures the variable to use the . /// @@ -58,16 +71,7 @@ public static class VariableExtensions public static object? ParseValue(this Variable variable, object? value) { var genericType = variable.GetType().GenericTypeArguments.FirstOrDefault(); - var serializerOptions = new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - ReferenceHandler = ReferenceHandler.Preserve, - PropertyNameCaseInsensitive = true, - Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) - }; - serializerOptions.Converters.Add(new JsonStringEnumConverter()); - serializerOptions.Converters.Add(new ExpandoObjectConverterFactory()); - var converterOptions = new ObjectConverterOptions(serializerOptions); + var converterOptions = new ObjectConverterOptions(SerializerOptions); return genericType == null ? value : value?.ConvertTo(genericType, converterOptions); }