Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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()}'.");
}
Expand Down
35 changes: 21 additions & 14 deletions ReflectorNet/src/Extension/ExtensionsJson.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -29,31 +36,31 @@ 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;

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);
}
}
}
2 changes: 1 addition & 1 deletion ReflectorNet/src/Reflector/Reflector.CallMethod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
5 changes: 3 additions & 2 deletions ReflectorNet/src/Reflector/Reflector.Error.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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<MethodInfo> methods)
public static string MoreThanOneMethodFound(Reflector reflector, List<MethodInfo> 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):
Expand Down
1 change: 1 addition & 0 deletions ReflectorNet/src/Utils/Json/JsonSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down