Make enums serialize as strings if using the reflection-based serializer. (#473)

* Make enums serialize as strings if using the reflection-based serializer.

* Remove unnecessary partial

* Use an explicit reflection-based converter for enums.

* Update comments

* Make the reflection-based enum converter public.
This commit is contained in:
Eirik Tsarpalis 2025-06-12 17:25:54 +02:00 • committed by GitHub
commit 1e8fb04037
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,4 +1,6 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
namespace ModelContextProtocol.Tests;
@ -22,4 +24,27 @@ public static class McpJsonUtilitiesTests
Assert.Equal(JsonSerializer.IsReflectionEnabledByDefault, options.TryGetTypeInfo(anonType, out _));
}
[Fact]
public static void DefaultOptions_UnknownEnumHandling()
{
var options = McpJsonUtilities.DefaultOptions;
if (JsonSerializer.IsReflectionEnabledByDefault)
{
Assert.Equal("\"A\"", JsonSerializer.Serialize(EnumWithoutAnnotation.A, options));
Assert.Equal("\"A\"", JsonSerializer.Serialize(EnumWithAnnotation.A, options));
}
else
{
options = new(options) { TypeInfoResolver = new DefaultJsonTypeInfoResolver() };
Assert.Equal("1", JsonSerializer.Serialize(EnumWithoutAnnotation.A, options));
Assert.Equal("\"A\"", JsonSerializer.Serialize(EnumWithAnnotation.A, options));
}
}
public enum EnumWithoutAnnotation { A = 1, B = 2, C = 3 }
[JsonConverter(typeof(JsonStringEnumConverter<EnumWithAnnotation>))]
public enum EnumWithAnnotation { A = 1, B = 2, C = 3 }
}