From 29ce70d574f08fd133d829438aa8a490a3e7baa1 Mon Sep 17 00:00:00 2001 From: Renato Lima Date: Mon, 11 Mar 2024 10:14:07 -0200 Subject: [PATCH] Simplify JSON serialization of exceptions +semver: patch --- .../Common/SimpleExceptionConverter.cs | 49 +++++++++++++++++++ .../Extensions/ObjectExtensions.cs | 12 +++-- .../Middlewares/RequestMatchingMiddleware.cs | 2 +- 3 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/Mockaco.AspNetCore/Common/SimpleExceptionConverter.cs diff --git a/src/Mockaco.AspNetCore/Common/SimpleExceptionConverter.cs b/src/Mockaco.AspNetCore/Common/SimpleExceptionConverter.cs new file mode 100644 index 0000000..16719e0 --- /dev/null +++ b/src/Mockaco.AspNetCore/Common/SimpleExceptionConverter.cs @@ -0,0 +1,49 @@ +namespace Mockaco.Common +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Linq; + using System; + + internal class SimpleExceptionConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return typeof(Exception).IsAssignableFrom(objectType); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + throw new NotImplementedException("Deserializing exceptions is not supported."); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var exception = value as Exception; + if (exception == null) + { + serializer.Serialize(writer, null); + return; + } + + var obj = new JObject + { + ["Type"] = exception.GetType().Name, + ["Message"] = exception.Message, + + }; + + if (exception.Data.Count > 0) + { + obj["Data"] = JToken.FromObject(exception.Data, serializer); + } + + if (exception.InnerException != null) + { + obj["InnerException"] = JToken.FromObject(exception.InnerException, serializer); + } + + obj.WriteTo(writer); + } + } + +} diff --git a/src/Mockaco.AspNetCore/Extensions/ObjectExtensions.cs b/src/Mockaco.AspNetCore/Extensions/ObjectExtensions.cs index 9f0f239..c97ef28 100644 --- a/src/Mockaco.AspNetCore/Extensions/ObjectExtensions.cs +++ b/src/Mockaco.AspNetCore/Extensions/ObjectExtensions.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using Mockaco.Common; +using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using System.Linq; @@ -7,10 +8,13 @@ namespace System { internal static class ObjectExtensions { - private static readonly JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings + private static readonly JsonSerializerSettings _jsonSerializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented, - Converters = new JsonConverter[] { new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy()} }, + Converters = [ + new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy()}, + new SimpleExceptionConverter() + ], NullValueHandling = NullValueHandling.Ignore }; @@ -24,7 +28,7 @@ public static string ToJson(this T param) try { - return JsonConvert.SerializeObject(param, JsonSerializerSettings); + return JsonConvert.SerializeObject(param, _jsonSerializerSettings); } catch { diff --git a/src/Mockaco.AspNetCore/Middlewares/RequestMatchingMiddleware.cs b/src/Mockaco.AspNetCore/Middlewares/RequestMatchingMiddleware.cs index 8cac54e..73f13a1 100644 --- a/src/Mockaco.AspNetCore/Middlewares/RequestMatchingMiddleware.cs +++ b/src/Mockaco.AspNetCore/Middlewares/RequestMatchingMiddleware.cs @@ -103,7 +103,7 @@ private async Task LogHttpContext(HttpContext httpContext) if (string.IsNullOrEmpty(body)) { - _logger.LogDebug("Body is not present", body); + _logger.LogDebug("Body is not present"); } else {