@@ -59,6 +59,15 @@ public class EnumSerializer
59
59
*/
60
60
protected final EnumValues _valuesByEnumNaming ;
61
61
62
+ /**
63
+ * Map that contains pre-resolved values for {@link Enum#toString} to use for serialization,
64
+ * while respecting {@link com.fasterxml.jackson.annotation.JsonProperty}
65
+ * and {@link com.fasterxml.jackson.databind.cfg.EnumFeature#WRITE_ENUMS_TO_LOWERCASE}.
66
+ *
67
+ * @since 2.16
68
+ */
69
+ protected final EnumValues _valuesByToString ;
70
+
62
71
/*
63
72
/**********************************************************
64
73
/* Construction, initialization
@@ -71,6 +80,7 @@ public EnumSerializer(EnumValues v, Boolean serializeAsIndex)
71
80
_values = v ;
72
81
_serializeAsIndex = serializeAsIndex ;
73
82
_valuesByEnumNaming = null ;
83
+ _valuesByToString = null ;
74
84
}
75
85
76
86
/**
@@ -82,6 +92,20 @@ public EnumSerializer(EnumValues v, Boolean serializeAsIndex, EnumValues valuesB
82
92
_values = v ;
83
93
_serializeAsIndex = serializeAsIndex ;
84
94
_valuesByEnumNaming = valuesByEnumNaming ;
95
+ _valuesByToString = null ;
96
+ }
97
+
98
+ /**
99
+ * @since 2.16
100
+ */
101
+ public EnumSerializer (EnumValues v , Boolean serializeAsIndex , EnumValues valuesByEnumNaming ,
102
+ EnumValues valuesByToString )
103
+ {
104
+ super (v .getEnumClass (), false );
105
+ _values = v ;
106
+ _serializeAsIndex = serializeAsIndex ;
107
+ _valuesByEnumNaming = valuesByEnumNaming ;
108
+ _valuesByToString = valuesByToString ;
85
109
}
86
110
87
111
/**
@@ -100,8 +124,9 @@ public static EnumSerializer construct(Class<?> enumClass, SerializationConfig c
100
124
*/
101
125
EnumValues v = EnumValues .constructFromName (config , beanDesc .getClassInfo ());
102
126
EnumValues valuesByEnumNaming = constructEnumNamingStrategyValues (config , (Class <Enum <?>>) enumClass , beanDesc .getClassInfo ());
127
+ EnumValues valuesByToString = EnumValues .constructFromToString (config , beanDesc .getClassInfo ());
103
128
Boolean serializeAsIndex = _isShapeWrittenUsingIndex (enumClass , format , true , null );
104
- return new EnumSerializer (v , serializeAsIndex , valuesByEnumNaming );
129
+ return new EnumSerializer (v , serializeAsIndex , valuesByEnumNaming , valuesByToString );
105
130
}
106
131
107
132
/**
@@ -154,7 +179,7 @@ public final void serialize(Enum<?> en, JsonGenerator gen, SerializerProvider se
154
179
}
155
180
// [databind#749]: or via toString()?
156
181
if (serializers .isEnabled (SerializationFeature .WRITE_ENUMS_USING_TO_STRING )) {
157
- gen .writeString (en . toString ( ));
182
+ gen .writeString (_valuesByToString . serializedValueFor ( en ));
158
183
return ;
159
184
}
160
185
gen .writeString (_values .serializedValueFor (en ));
@@ -205,8 +230,8 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
205
230
// Use toString()?
206
231
if ((serializers != null ) &&
207
232
serializers .isEnabled (SerializationFeature .WRITE_ENUMS_USING_TO_STRING )) {
208
- for (Enum <?> e : _values . enums ()) {
209
- enums .add (e . toString ());
233
+ for (SerializableString value : _valuesByToString . values ()) {
234
+ enums .add (value . getValue ());
210
235
}
211
236
} else {
212
237
// No, serialize using name() or explicit overrides
0 commit comments