Skip to content

Commit ea4b2e6

Browse files
authored
Merge pull request #45 from IvanMurzak/update/json-serialization-logging
fix: Enhance JSON serialization with logging
2 parents b52932c + 46f4df4 commit ea4b2e6

5 files changed

Lines changed: 32 additions & 21 deletions

File tree

ReflectorNet/src/Converter/Reflection/GenericReflectionConverter.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ protected override SerializedMember InternalSerialize(
3535
var isStruct = type.IsValueType && !type.IsPrimitive && !type.IsEnum;
3636
if (type.IsClass || isStruct)
3737
{
38-
return recursive
39-
? new SerializedMember()
38+
if (recursive)
39+
{
40+
return new SerializedMember()
4041
{
4142
name = name,
4243
typeName = type.GetTypeId() ?? string.Empty,
@@ -57,8 +58,9 @@ protected override SerializedMember InternalSerialize(
5758
logger: logger,
5859
context: context),
5960
valueJsonElement = new JsonObject().ToJsonElement()
60-
}
61-
: SerializedMember.FromJson(type, obj.ToJson(reflector), name: name);
61+
};
62+
}
63+
return SerializedMember.FromJson(type, obj.ToJson(reflector, logger: logger), name: name);
6264
}
6365
throw new ArgumentException($"Unsupported type: '{type.GetTypeId()}' for converter '{GetType().GetTypeShortName()}'.");
6466
}

ReflectorNet/src/Extension/ExtensionsJson.cs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,20 @@
88
using System;
99
using System.Text.Json;
1010
using System.Text.Json.Nodes;
11+
using Microsoft.Extensions.Logging;
1112

1213
namespace com.IvanMurzak.ReflectorNet
1314
{
1415
public static class ExtensionsJson
1516
{
16-
public static JsonElement ToJsonElement(this object data, Reflector? reflector, JsonSerializerOptions? options = null)
17-
=> JsonSerializer.SerializeToElement(data, options ?? reflector?.JsonSerializerOptions);
17+
public static JsonElement ToJsonElement(this object data, Reflector? reflector, JsonSerializerOptions? options = null, ILogger? logger = null)
18+
{
19+
if (logger?.IsEnabled(LogLevel.Trace) == true)
20+
logger.LogTrace("Converting object of type {Type} to JsonElement.",
21+
data?.GetType().GetTypeId().ValueOrNull());
22+
23+
return JsonSerializer.SerializeToElement(data, options ?? reflector?.JsonSerializerOptions);
24+
}
1825

1926
public static JsonElement? ToJsonElement(this JsonNode? node)
2027
{
@@ -29,31 +36,31 @@ public static JsonElement ToJsonElement(this object data, Reflector? reflector,
2936
return document.RootElement.Clone();
3037
}
3138

32-
public static string ToJson(this object? value, Reflector? reflector, JsonSerializerOptions? options = null)
33-
=> ToJson(
39+
public static string ToJson(this object? value, Reflector? reflector, JsonSerializerOptions? options = null, ILogger? logger = null)
40+
{
41+
return ToJson(
3442
value: value,
3543
defaultValue: Utils.JsonSerializer.EmptyJsonObject, // Use empty JSON object as default value
3644
reflector: reflector,
37-
options: options);
38-
39-
public static string ToJsonOrEmptyJsonObject(this object? value, Reflector? reflector, JsonSerializerOptions? options = null)
40-
=> ToJson(
41-
value: value,
42-
defaultValue: Utils.JsonSerializer.EmptyJsonObject,
43-
reflector: reflector,
44-
options: options);
45+
options: options,
46+
logger: logger);
47+
}
4548

46-
public static string ToJson(this object? value, string defaultValue, Reflector? reflector, JsonSerializerOptions? options = null)
49+
public static string ToJson(this object? value, string defaultValue, Reflector? reflector, JsonSerializerOptions? options = null, ILogger? logger = null)
4750
{
4851
if (value == null)
4952
return defaultValue;
5053

5154
if (value is Utils.JsonSerializer)
5255
throw new ArgumentException("Cannot serialize JsonSerializer instance.", nameof(value));
5356

57+
if (logger?.IsEnabled(LogLevel.Trace) == true)
58+
logger.LogTrace("Serializing object of type {Type} to JSON string.",
59+
value.GetType().GetTypeId().ValueOrNull());
60+
5461
return JsonSerializer.Serialize(
5562
value: value,
56-
options: options ?? reflector?.JsonSerializerOptions ?? new JsonSerializerOptions());
63+
options: options ?? reflector?.JsonSerializerOptions);
5764
}
5865
}
5966
}

ReflectorNet/src/Reflector/Reflector.CallMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ out var error
147147
: methodWrapper.Invoke();
148148

149149
var result = task.Result;
150-
return $"[Success] Execution result:\n```json\n{result.ToJson(reflector)}\n```";
150+
return $"[Success] Execution result:\n```json\n{result.ToJson(reflector, logger: logger)}\n```";
151151
};
152152

153153
if (executeInMainThread)

ReflectorNet/src/Reflector/Reflector.Error.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Reflection;
55
using com.IvanMurzak.ReflectorNet.Model;
66
using com.IvanMurzak.ReflectorNet.Utils;
7+
using Microsoft.Extensions.Logging;
78

89
namespace com.IvanMurzak.ReflectorNet
910
{
@@ -42,10 +43,10 @@ public static string InvalidFieldType(SerializedMember serializedProperty, Field
4243
public static string NotSupportedInRuntime(Type type)
4344
=> $"[Error] Type '{type.GetTypeId().ValueOrNull()}' is not supported in runtime for now.";
4445

45-
public static string MoreThanOneMethodFound(Reflector reflector, List<MethodInfo> methods)
46+
public static string MoreThanOneMethodFound(Reflector reflector, List<MethodInfo> methods, ILogger? logger = null)
4647
{
4748
var methodDataList = methods.Select(method => new MethodData(reflector, method));
48-
var methodsString = methodDataList.ToJson(reflector, options: null);
49+
var methodsString = methodDataList.ToJson(reflector, logger: logger);
4950

5051
return @$"[Error] Found more than one method. Only single method should be targeted. Please specify the method name more precisely.
5152
Found {methods.Count} method(s):

ReflectorNet/src/Utils/Json/JsonSerializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public JsonSerializer(Reflector reflector)
7878
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, // Ignore 'null' field and properties
7979
// DefaultIgnoreCondition = JsonIgnoreCondition.Never, // Include 'null' fields and properties
8080
ReferenceHandler = ReferenceHandler.IgnoreCycles, // Prevents StackOverflow from circular references
81+
NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals,
8182
PropertyNamingPolicy = null,
8283
PropertyNameCaseInsensitive = true,
8384
IncludeFields = true, // Include public fields in serialization

0 commit comments

Comments
 (0)