diff --git a/ReflectorNet/src/Converter/Reflection/GenericReflectionConverter.cs b/ReflectorNet/src/Converter/Reflection/GenericReflectionConverter.cs index 785d7a1..fb84855 100644 --- a/ReflectorNet/src/Converter/Reflection/GenericReflectionConverter.cs +++ b/ReflectorNet/src/Converter/Reflection/GenericReflectionConverter.cs @@ -35,8 +35,9 @@ protected override SerializedMember InternalSerialize( var isStruct = type.IsValueType && !type.IsPrimitive && !type.IsEnum; if (type.IsClass || isStruct) { - return recursive - ? new SerializedMember() + if (recursive) + { + return new SerializedMember() { name = name, typeName = type.GetTypeId() ?? string.Empty, @@ -57,8 +58,9 @@ protected override SerializedMember InternalSerialize( logger: logger, context: context), valueJsonElement = new JsonObject().ToJsonElement() - } - : SerializedMember.FromJson(type, obj.ToJson(reflector), name: name); + }; + } + return SerializedMember.FromJson(type, obj.ToJson(reflector, logger: logger), name: name); } throw new ArgumentException($"Unsupported type: '{type.GetTypeId()}' for converter '{GetType().GetTypeShortName()}'."); } diff --git a/ReflectorNet/src/Extension/ExtensionsJson.cs b/ReflectorNet/src/Extension/ExtensionsJson.cs index 3866b21..031b17c 100644 --- a/ReflectorNet/src/Extension/ExtensionsJson.cs +++ b/ReflectorNet/src/Extension/ExtensionsJson.cs @@ -8,13 +8,20 @@ using System; using System.Text.Json; using System.Text.Json.Nodes; +using Microsoft.Extensions.Logging; namespace com.IvanMurzak.ReflectorNet { public static class ExtensionsJson { - public static JsonElement ToJsonElement(this object data, Reflector? reflector, JsonSerializerOptions? options = null) - => JsonSerializer.SerializeToElement(data, options ?? reflector?.JsonSerializerOptions); + public static JsonElement ToJsonElement(this object data, Reflector? reflector, JsonSerializerOptions? options = null, ILogger? logger = null) + { + if (logger?.IsEnabled(LogLevel.Trace) == true) + logger.LogTrace("Converting object of type {Type} to JsonElement.", + data?.GetType().GetTypeId().ValueOrNull()); + + return JsonSerializer.SerializeToElement(data, options ?? reflector?.JsonSerializerOptions); + } public static JsonElement? ToJsonElement(this JsonNode? node) { @@ -29,21 +36,17 @@ public static JsonElement ToJsonElement(this object data, Reflector? reflector, return document.RootElement.Clone(); } - public static string ToJson(this object? value, Reflector? reflector, JsonSerializerOptions? options = null) - => ToJson( + public static string ToJson(this object? value, Reflector? reflector, JsonSerializerOptions? options = null, ILogger? logger = null) + { + return ToJson( value: value, defaultValue: Utils.JsonSerializer.EmptyJsonObject, // Use empty JSON object as default value reflector: reflector, - options: options); - - public static string ToJsonOrEmptyJsonObject(this object? value, Reflector? reflector, JsonSerializerOptions? options = null) - => ToJson( - value: value, - defaultValue: Utils.JsonSerializer.EmptyJsonObject, - reflector: reflector, - options: options); + options: options, + logger: logger); + } - public static string ToJson(this object? value, string defaultValue, Reflector? reflector, JsonSerializerOptions? options = null) + public static string ToJson(this object? value, string defaultValue, Reflector? reflector, JsonSerializerOptions? options = null, ILogger? logger = null) { if (value == null) return defaultValue; @@ -51,9 +54,13 @@ public static string ToJson(this object? value, string defaultValue, Reflector? if (value is Utils.JsonSerializer) throw new ArgumentException("Cannot serialize JsonSerializer instance.", nameof(value)); + if (logger?.IsEnabled(LogLevel.Trace) == true) + logger.LogTrace("Serializing object of type {Type} to JSON string.", + value.GetType().GetTypeId().ValueOrNull()); + return JsonSerializer.Serialize( value: value, - options: options ?? reflector?.JsonSerializerOptions ?? new JsonSerializerOptions()); + options: options ?? reflector?.JsonSerializerOptions); } } } \ No newline at end of file diff --git a/ReflectorNet/src/Reflector/Reflector.CallMethod.cs b/ReflectorNet/src/Reflector/Reflector.CallMethod.cs index bf14917..d00a89f 100644 --- a/ReflectorNet/src/Reflector/Reflector.CallMethod.cs +++ b/ReflectorNet/src/Reflector/Reflector.CallMethod.cs @@ -147,7 +147,7 @@ out var error : methodWrapper.Invoke(); var result = task.Result; - return $"[Success] Execution result:\n```json\n{result.ToJson(reflector)}\n```"; + return $"[Success] Execution result:\n```json\n{result.ToJson(reflector, logger: logger)}\n```"; }; if (executeInMainThread) diff --git a/ReflectorNet/src/Reflector/Reflector.Error.cs b/ReflectorNet/src/Reflector/Reflector.Error.cs index dce25e2..65bf8e6 100644 --- a/ReflectorNet/src/Reflector/Reflector.Error.cs +++ b/ReflectorNet/src/Reflector/Reflector.Error.cs @@ -4,6 +4,7 @@ using System.Reflection; using com.IvanMurzak.ReflectorNet.Model; using com.IvanMurzak.ReflectorNet.Utils; +using Microsoft.Extensions.Logging; namespace com.IvanMurzak.ReflectorNet { @@ -42,10 +43,10 @@ public static string InvalidFieldType(SerializedMember serializedProperty, Field public static string NotSupportedInRuntime(Type type) => $"[Error] Type '{type.GetTypeId().ValueOrNull()}' is not supported in runtime for now."; - public static string MoreThanOneMethodFound(Reflector reflector, List methods) + public static string MoreThanOneMethodFound(Reflector reflector, List methods, ILogger? logger = null) { var methodDataList = methods.Select(method => new MethodData(reflector, method)); - var methodsString = methodDataList.ToJson(reflector, options: null); + var methodsString = methodDataList.ToJson(reflector, logger: logger); return @$"[Error] Found more than one method. Only single method should be targeted. Please specify the method name more precisely. Found {methods.Count} method(s): diff --git a/ReflectorNet/src/Utils/Json/JsonSerializer.cs b/ReflectorNet/src/Utils/Json/JsonSerializer.cs index 60a266d..1191009 100644 --- a/ReflectorNet/src/Utils/Json/JsonSerializer.cs +++ b/ReflectorNet/src/Utils/Json/JsonSerializer.cs @@ -78,6 +78,7 @@ public JsonSerializer(Reflector reflector) DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, // Ignore 'null' field and properties // DefaultIgnoreCondition = JsonIgnoreCondition.Never, // Include 'null' fields and properties ReferenceHandler = ReferenceHandler.IgnoreCycles, // Prevents StackOverflow from circular references + NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals, PropertyNamingPolicy = null, PropertyNameCaseInsensitive = true, IncludeFields = true, // Include public fields in serialization