diff --git a/src/modules/Elsa.Common/Services/JsonFormatter.cs b/src/modules/Elsa.Common/Services/JsonFormatter.cs index d543942c22..b8265a56a6 100644 --- a/src/modules/Elsa.Common/Services/JsonFormatter.cs +++ b/src/modules/Elsa.Common/Services/JsonFormatter.cs @@ -1,5 +1,7 @@ +using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; +using System.Text.Unicode; namespace Elsa.Common.Services; @@ -10,14 +12,17 @@ public class JsonFormatter : IFormatter public JsonFormatter() { - _options = new JsonSerializerOptions(); + _options = new JsonSerializerOptions + { + Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) + }; _options.Converters.Add(new JsonStringEnumConverter()); } /// public ValueTask ToStringAsync(object value, CancellationToken cancellationToken = default) { - var json = JsonSerializer.Serialize(value); + var json = JsonSerializer.Serialize(value, _options); return ValueTask.FromResult(json); } diff --git a/test/unit/Elsa.Common.UnitTests/JsonFormatterTests.cs b/test/unit/Elsa.Common.UnitTests/JsonFormatterTests.cs new file mode 100644 index 0000000000..6844c7f835 --- /dev/null +++ b/test/unit/Elsa.Common.UnitTests/JsonFormatterTests.cs @@ -0,0 +1,20 @@ +using Elsa.Common.Services; + +namespace Elsa.Common.UnitTests; + +public class JsonFormatterTests +{ + [Fact] + public async Task ToStringAsync_DoesNotEscapeUnicodeCharacters() + { + var formatter = new JsonFormatter(); + var value = new { Name = "ÆØÅ" }; + + var json = await formatter.ToStringAsync(value); + + Assert.Contains("ÆØÅ", json); + Assert.DoesNotContain(@"\u00C6", json, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain(@"\u00D8", json, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain(@"\u00C5", json, StringComparison.OrdinalIgnoreCase); + } +}