Skip to content

Commit cc09b5f

Browse files
authored
Use JsonStringEnumConverter<T> instead of JsonStringEnumConverter (#1863)
Unlike JsonStringEnumConverter, the generic JsonStringEnumConverter<T> is AOT compatible. This prevents the [SYSLIB1034](https://learn.microsoft.com/en-us/dotnet/fundamentals/syslib-diagnostics/syslib1034) warning to occur when System.Text.Json source generation is used.
1 parent 58a90b9 commit cc09b5f

File tree

5 files changed

+115
-1
lines changed

5 files changed

+115
-1
lines changed

src/NJsonSchema.CodeGeneration.CSharp.Tests/EnumTests.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,41 @@ public async Task When_enum_name_contains_colon_then_it_is_removed_and_next_word
115115
CSharpCompiler.AssertCompile(code);
116116
}
117117

118+
[Theory]
119+
[InlineData(false)]
120+
[InlineData(true)]
121+
public async Task When_enum_is_string_then_generic_StringEnumConverter_is_used(bool nullable)
122+
{
123+
// Arrange
124+
var json =
125+
$$"""
126+
{
127+
"type": "object",
128+
"additionalProperties": false,
129+
"properties": {
130+
"size" : {
131+
"type": [ "string"{{(nullable ? ", \"null\"" : "")}} ],
132+
"enum" : [
133+
"small",
134+
"medium",
135+
"large"
136+
]
137+
}
138+
}
139+
}
140+
""";
141+
142+
var schema = await JsonSchema.FromJsonAsync(json);
143+
var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings { JsonLibrary = CSharpJsonLibrary.SystemTextJson });
144+
145+
// Act
146+
var code = generator.GenerateFile("MyClass");
147+
148+
// Assert
149+
await VerifyHelper.Verify(code);
150+
CSharpCompiler.AssertCompile(code);
151+
}
152+
118153
public class MyStringEnumListTest
119154
{
120155
public List<MyStringEnum> Enums { get; set; }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//----------------------
2+
// <auto-generated>
3+
// </auto-generated>
4+
//----------------------
5+
6+
7+
namespace MyNamespace
8+
{
9+
#pragma warning disable // Disable all warnings
10+
11+
public partial class MyClass
12+
{
13+
14+
[System.Text.Json.Serialization.JsonPropertyName("size")]
15+
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<MyClassSize>))]
16+
public MyClassSize Size { get; set; }
17+
18+
}
19+
20+
public enum MyClassSize
21+
{
22+
23+
[System.Runtime.Serialization.EnumMember(Value = @"small")]
24+
Small = 0,
25+
26+
27+
[System.Runtime.Serialization.EnumMember(Value = @"medium")]
28+
Medium = 1,
29+
30+
31+
[System.Runtime.Serialization.EnumMember(Value = @"large")]
32+
Large = 2,
33+
34+
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//----------------------
2+
// <auto-generated>
3+
// </auto-generated>
4+
//----------------------
5+
6+
7+
namespace MyNamespace
8+
{
9+
#pragma warning disable // Disable all warnings
10+
11+
public partial class MyClass
12+
{
13+
14+
[System.Text.Json.Serialization.JsonPropertyName("size")]
15+
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<MyClassSize>))]
16+
public MyClassSize? Size { get; set; }
17+
18+
}
19+
20+
public enum MyClassSize
21+
{
22+
23+
[System.Runtime.Serialization.EnumMember(Value = @"small")]
24+
Small = 0,
25+
26+
27+
[System.Runtime.Serialization.EnumMember(Value = @"medium")]
28+
Medium = 1,
29+
30+
31+
[System.Runtime.Serialization.EnumMember(Value = @"large")]
32+
Large = 2,
33+
34+
35+
}
36+
}

src/NJsonSchema.CodeGeneration.CSharp/Templates/Class.liquid

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
{%- endif -%}
9292
{%- if property.IsStringEnum -%}
9393
{%- if UseSystemTextJson -%}
94-
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter))]
94+
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<{{ property.Type | rtrimquestionmark }}>))]
9595
{%- else -%}
9696
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
9797
{%- endif -%}

src/NJsonSchema.CodeGeneration/DefaultTemplateFactory.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public DefaultTemplateFactory(CodeGeneratorSettingsBase settings, Assembly[] ass
4747
templateOptions.Filters.AddFilter("lowercamelcase", LiquidFilters.Lowercamelcase);
4848
templateOptions.Filters.AddFilter("uppercamelcase", LiquidFilters.Uppercamelcase);
4949
templateOptions.Filters.AddFilter("literal", LiquidFilters.Literal);
50+
templateOptions.Filters.AddFilter("rtrimquestionmark", LiquidFilters.RightTrimQuestionMark);
5051

5152
TemplateOptions = templateOptions;
5253
}
@@ -331,6 +332,12 @@ public static ValueTask<FluidValue> Literal(FluidValue input, FilterArguments ar
331332
var converted = ConversionUtilities.ConvertToStringLiteral(input.ToStringValue(), "\"", "\"");
332333
return new ValueTask<FluidValue>(new StringValue(converted, encode: false));
333334
}
335+
336+
public static ValueTask<FluidValue> RightTrimQuestionMark(FluidValue input, FilterArguments arguments, TemplateContext context)
337+
{
338+
var converted = input.ToStringValue().TrimEnd('?');
339+
return new ValueTask<FluidValue>(new StringValue(converted, encode: false));
340+
}
334341
}
335342

336343
/// <summary>

0 commit comments

Comments
 (0)