@@ -59,6 +59,15 @@ public class EnumSerializer
5959 */
6060 protected final EnumValues _valuesByEnumNaming ;
6161
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+
6271 /*
6372 /**********************************************************
6473 /* Construction, initialization
@@ -71,6 +80,7 @@ public EnumSerializer(EnumValues v, Boolean serializeAsIndex)
7180 _values = v ;
7281 _serializeAsIndex = serializeAsIndex ;
7382 _valuesByEnumNaming = null ;
83+ _valuesByToString = null ;
7484 }
7585
7686 /**
@@ -82,6 +92,20 @@ public EnumSerializer(EnumValues v, Boolean serializeAsIndex, EnumValues valuesB
8292 _values = v ;
8393 _serializeAsIndex = serializeAsIndex ;
8494 _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 ;
85109 }
86110
87111 /**
@@ -100,8 +124,9 @@ public static EnumSerializer construct(Class<?> enumClass, SerializationConfig c
100124 */
101125 EnumValues v = EnumValues .constructFromName (config , beanDesc .getClassInfo ());
102126 EnumValues valuesByEnumNaming = constructEnumNamingStrategyValues (config , (Class <Enum <?>>) enumClass , beanDesc .getClassInfo ());
127+ EnumValues valuesByToString = EnumValues .constructFromToString (config , beanDesc .getClassInfo ());
103128 Boolean serializeAsIndex = _isShapeWrittenUsingIndex (enumClass , format , true , null );
104- return new EnumSerializer (v , serializeAsIndex , valuesByEnumNaming );
129+ return new EnumSerializer (v , serializeAsIndex , valuesByEnumNaming , valuesByToString );
105130 }
106131
107132 /**
@@ -154,7 +179,7 @@ public final void serialize(Enum<?> en, JsonGenerator gen, SerializerProvider se
154179 }
155180 // [databind#749]: or via toString()?
156181 if (serializers .isEnabled (SerializationFeature .WRITE_ENUMS_USING_TO_STRING )) {
157- gen .writeString (en . toString ( ));
182+ gen .writeString (_valuesByToString . serializedValueFor ( en ));
158183 return ;
159184 }
160185 gen .writeString (_values .serializedValueFor (en ));
@@ -205,8 +230,8 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
205230 // Use toString()?
206231 if ((serializers != null ) &&
207232 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 ());
210235 }
211236 } else {
212237 // No, serialize using name() or explicit overrides
0 commit comments