diff --git a/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs b/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs index 149397a80..0faed24d0 100644 --- a/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs +++ b/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs @@ -8,10 +8,8 @@ namespace Elsa { public static class JObjectExtensions { - private static readonly JsonSerializer Serializer = new JsonSerializer().ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + public static T? GetState(this JObject? state, string key) => state.GetState(key, () => default!); - public static T? GetState(this JObject? state, string key) => state.GetState(key, () => default!); - public static T GetState(this JObject? state, string key, Func defaultValue) { var item = state?.GetValue(key, StringComparison.OrdinalIgnoreCase); @@ -19,7 +17,7 @@ namespace Elsa if (item == null || item.Type == JTokenType.Null) return defaultValue(); - return item.ToObject(Serializer)!; + return item.ToObject(CreateSerializer())!; } public static T? GetState(this JObject? state, Type type, string key) => state.GetState(type, key, () => default!); @@ -27,11 +25,25 @@ namespace Elsa public static T GetState(this JObject? state, Type type, string key, Func defaultValue) { var item = state?.GetValue(key, StringComparison.OrdinalIgnoreCase); - return item != null ? (T) item.ToObject(type, Serializer)! : defaultValue(); + return item != null ? (T) item.ToObject(type, CreateSerializer())! : defaultValue(); } - public static void SetState(this JObject state, string key, object? value) => state[key] = value != null ? JToken.FromObject(value, Serializer) : null; - + public static void SetState(this JObject state, string key, object? value) => state[key] = value != null ? JToken.FromObject(value, CreateSerializer()) : null; + public static bool HasKey(this JObject state, string key) => state.ContainsKey(key); + + private static JsonSerializer CreateSerializer() + { + var serializer = new JsonSerializer(); + + serializer.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.PreserveReferencesHandling = PreserveReferencesHandling.Objects; + serializer.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; + serializer.TypeNameHandling = TypeNameHandling.Auto; + + return serializer; + } } } \ No newline at end of file