Skip to content

Commit 2b7b258

Browse files
Neokilclaude
andcommitted
fix(csharp): use enum rendering functions for array-of-enum properties in JSON converter
Array-typed properties whose items are enums fell through to the generic JsonSerializer.Serialize/Deserialize path, which ignored the defined *ValueConverter.ToJsonValue/*FromStringOrDefault functions and serialized enum values using the default .NET JSON behaviour (PascalCase names). Add explicit {{#items.isEnum}} branches in both the read (Deserialize) and write (Serialize) paths of the generated JsonConverter so that each item in an enum array is processed via the same converter functions used for scalar enum properties. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a2fd144 commit 2b7b258

2 files changed

Lines changed: 97 additions & 0 deletions

File tree

modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,21 @@
251251
{{^isNumeric}}
252252
{{^isDate}}
253253
{{^isDateTime}}
254+
{{#items.isEnum}}
255+
var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Items = new List<{{#items.isInnerEnum}}{{classname}}.{{/items.isInnerEnum}}{{{items.datatypeWithEnum}}}>();
256+
while (utf8JsonReader.Read())
257+
{
258+
if (utf8JsonReader.TokenType == JsonTokenType.EndArray)
259+
break;
260+
string{{nrt?}} {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ItemRawValue = utf8JsonReader.GetString();
261+
if ({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ItemRawValue != null)
262+
{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Items.Add({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.FromStringOrDefault({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ItemRawValue){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}FromStringOrDefault({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ItemRawValue){{/items.isInnerEnum}});
263+
}
264+
{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} = {{>OptionProperty}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Items);
265+
{{/items.isEnum}}
266+
{{^items.isEnum}}
254267
{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} = {{>OptionProperty}}JsonSerializer.Deserialize<{{{datatypeWithEnum}}}>(ref utf8JsonReader, jsonSerializerOptions){{^isNullable}}{{nrt!}}{{/isNullable}});
268+
{{/items.isEnum}}
255269
{{/isDateTime}}
256270
{{/isDate}}
257271
{{/isNumeric}}
@@ -612,14 +626,30 @@
612626
if ({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} != null)
613627
{
614628
writer.WritePropertyName("{{baseName}}");
629+
{{^items.isEnum}}
615630
JsonSerializer.Serialize(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
631+
{{/items.isEnum}}
632+
{{#items.isEnum}}
633+
writer.WriteStartArray();
634+
foreach (var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item in {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}})
635+
{{^items.isNumeric}}writer.WriteStringValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}{{#items.isNumeric}}writer.WriteNumberValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}
636+
writer.WriteEndArray();
637+
{{/items.isEnum}}
616638
}
617639
else
618640
writer.WriteNull("{{baseName}}");
619641
{{/isNullable}}
620642
{{^isNullable}}
621643
writer.WritePropertyName("{{baseName}}");
644+
{{^items.isEnum}}
622645
JsonSerializer.Serialize(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
646+
{{/items.isEnum}}
647+
{{#items.isEnum}}
648+
writer.WriteStartArray();
649+
foreach (var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item in {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}})
650+
{{^items.isNumeric}}writer.WriteStringValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}{{#items.isNumeric}}writer.WriteNumberValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}
651+
writer.WriteEndArray();
652+
{{/items.isEnum}}
623653
{{/isNullable}}
624654
{{/required}}
625655
{{^required}}
@@ -628,15 +658,31 @@
628658
if ({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}Option.Value != null)
629659
{
630660
writer.WritePropertyName("{{baseName}}");
661+
{{^items.isEnum}}
631662
JsonSerializer.Serialize(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
663+
{{/items.isEnum}}
664+
{{#items.isEnum}}
665+
writer.WriteStartArray();
666+
foreach (var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item in {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}Option.Value{{nrt!}})
667+
{{^items.isNumeric}}writer.WriteStringValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}{{#items.isNumeric}}writer.WriteNumberValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}
668+
writer.WriteEndArray();
669+
{{/items.isEnum}}
632670
}
633671
else
634672
writer.WriteNull("{{baseName}}");
635673
{{/isNullable}}
636674
{{^isNullable}}
637675
{
638676
writer.WritePropertyName("{{baseName}}");
677+
{{^items.isEnum}}
639678
JsonSerializer.Serialize(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
679+
{{/items.isEnum}}
680+
{{#items.isEnum}}
681+
writer.WriteStartArray();
682+
foreach (var {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item in {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}{{nrt!}})
683+
{{^items.isNumeric}}writer.WriteStringValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}{{#items.isNumeric}}writer.WriteNumberValue({{^items.isInnerEnum}}{{{items.datatypeWithEnum}}}ValueConverter.ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}}{{#items.isInnerEnum}}{{classname}}.{{{items.datatypeWithEnum}}}ToJsonValue({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}Item){{/items.isInnerEnum}});{{/items.isNumeric}}
684+
writer.WriteEndArray();
685+
{{/items.isEnum}}
640686
}
641687
{{/isNullable}}
642688
{{/required}}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Enum Array Test
4+
description: >-
5+
Tests that array-of-enum properties are serialized and deserialized using
6+
the defined enum rendering functions rather than falling back to default
7+
PascalCase JSON serialization.
8+
version: 1.0.0
9+
license:
10+
name: Apache-2.0
11+
url: 'https://www.apache.org/licenses/LICENSE-2.0.html'
12+
paths:
13+
/shipments:
14+
get:
15+
operationId: GetShipments
16+
tags:
17+
- Shipments
18+
responses:
19+
'200':
20+
description: Returns a list of shipments
21+
content:
22+
application/json:
23+
schema:
24+
type: array
25+
items:
26+
$ref: '#/components/schemas/Shipment'
27+
servers:
28+
- url: 'http://localhost'
29+
components:
30+
schemas:
31+
Shipment:
32+
type: object
33+
required:
34+
- id
35+
- allowedMethods
36+
properties:
37+
id:
38+
type: integer
39+
format: int32
40+
allowedMethods:
41+
type: array
42+
items:
43+
$ref: '#/components/schemas/ShippingMethod'
44+
preferredMethod:
45+
$ref: '#/components/schemas/ShippingMethod'
46+
ShippingMethod:
47+
type: string
48+
enum:
49+
- standard
50+
- express
51+
- overnight

0 commit comments

Comments
 (0)