Skip to content

Commit ce76f45

Browse files
Make enums serialize as strings if using the reflection-based serializer.
1 parent 888f171 commit ce76f45

2 files changed

Lines changed: 31 additions & 2 deletions

File tree

src/ModelContextProtocol/McpJsonUtilities.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@ private static JsonSerializerOptions CreateDefaultOptions()
3838
// Copy the configuration from the source generated context.
3939
JsonSerializerOptions options = new(JsonContext.Default.Options);
4040

41-
// Chain with all supported types from MEAI
41+
// Chain with all supported types and converters from MEAI
4242
options.TypeInfoResolverChain.Add(AIJsonUtilities.DefaultOptions.TypeInfoResolver!);
43+
foreach (JsonConverter converter in AIJsonUtilities.DefaultOptions.Converters)
44+
{
45+
options.Converters.Add(converter);
46+
}
4347

4448
options.MakeReadOnly();
4549
return options;

tests/ModelContextProtocol.Tests/McpJsonUtilitiesTests.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
using System.Text.Json.Serialization.Metadata;
24

35
namespace ModelContextProtocol.Tests;
46

5-
public static class McpJsonUtilitiesTests
7+
public static partial class McpJsonUtilitiesTests
68
{
79
[Fact]
810
public static void DefaultOptions_IsSingleton()
@@ -22,4 +24,27 @@ public static void DefaultOptions_UseReflectionWhenEnabled()
2224

2325
Assert.Equal(JsonSerializer.IsReflectionEnabledByDefault, options.TryGetTypeInfo(anonType, out _));
2426
}
27+
28+
[Fact]
29+
public static void DefaultOptions_UnknownEnumHandling()
30+
{
31+
var options = McpJsonUtilities.DefaultOptions;
32+
33+
if (JsonSerializer.IsReflectionEnabledByDefault)
34+
{
35+
Assert.Equal("\"A\"", JsonSerializer.Serialize(EnumWithoutAnnotation.A, options));
36+
Assert.Equal("\"A\"", JsonSerializer.Serialize(EnumWithAnnotation.A, options));
37+
}
38+
else
39+
{
40+
options = new(options) { TypeInfoResolver = new DefaultJsonTypeInfoResolver() };
41+
Assert.Equal("1", JsonSerializer.Serialize(EnumWithoutAnnotation.A, options));
42+
Assert.Equal("\"A\"", JsonSerializer.Serialize(EnumWithAnnotation.A, options));
43+
}
44+
}
45+
46+
public enum EnumWithoutAnnotation { A = 1, B = 2, C = 3 }
47+
48+
[JsonConverter(typeof(JsonStringEnumConverter<EnumWithAnnotation>))]
49+
public enum EnumWithAnnotation { A = 1, B = 2, C = 3 }
2550
}

0 commit comments

Comments
 (0)