Skip to content

Commit 0f0d04c

Browse files
authored
Feature : add EnumFeature.WRITE_ENUMS_TO_LOWERCASE #3053 #3054 (#3776)
1 parent 6c8c151 commit 0f0d04c

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

src/main/java/com/fasterxml/jackson/databind/cfg/EnumFeature.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,16 @@ public enum EnumFeature implements DatatypeFeature
2222
*
2323
* @since 2.15
2424
*/
25-
READ_ENUM_KEYS_USING_INDEX(false)
26-
;
25+
READ_ENUM_KEYS_USING_INDEX(false),
26+
27+
/**
28+
* Feature that determines standard serialization mechanism used for
29+
* Enum values: if enabled, return value of <code>Enum.name().toLowerCase()</code>
30+
* is used; if disabled, return value of <code>Enum.name()</code> is used.
31+
*<p>
32+
* Feature is disabled by default.
33+
*/
34+
WRITE_ENUMS_TO_LOWERCASE(false);
2735

2836
private final static int FEATURE_INDEX = DatatypeFeatures.FEATURE_INDEX_ENUM;
2937

src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import com.fasterxml.jackson.core.SerializableString;
66
import com.fasterxml.jackson.databind.*;
7+
import com.fasterxml.jackson.databind.cfg.EnumFeature;
78
import com.fasterxml.jackson.databind.cfg.MapperConfig;
89

910
/**
@@ -56,6 +57,9 @@ public static EnumValues constructFromName(MapperConfig<?> config, Class<Enum<?>
5657
if (name == null) {
5758
name = en.name();
5859
}
60+
if (config.isEnabled(EnumFeature.WRITE_ENUMS_TO_LOWERCASE)) {
61+
name = name.toLowerCase();
62+
}
5963
textual[en.ordinal()] = config.compileString(name);
6064
}
6165
return construct(enumClass, textual);

src/test/java/com/fasterxml/jackson/databind/ser/jdk/EnumSerializationTest.java

+20
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.fasterxml.jackson.core.*;
99
import com.fasterxml.jackson.databind.*;
1010
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
11+
import com.fasterxml.jackson.databind.cfg.EnumFeature;
1112
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
1213
import com.fasterxml.jackson.databind.module.SimpleModule;
1314
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
@@ -330,6 +331,25 @@ public void testEnumWithJsonKey() throws Exception
330331
= Collections.singletonMap(EnumWithJsonKey.A, EnumWithJsonKey.B);
331332
assertEquals(a2q("{'key:a':'value:b'}"), MAPPER.writeValueAsString(input2));
332333
}
334+
335+
public void testEnumFeature_WRITE_ENUMS_TO_LOWERCASE_isDisabledByDefault() {
336+
ObjectReader READER = MAPPER.reader();
337+
assertFalse(READER.isEnabled(EnumFeature.WRITE_ENUMS_TO_LOWERCASE));
338+
assertFalse(READER.without(EnumFeature.WRITE_ENUMS_TO_LOWERCASE)
339+
.isEnabled(EnumFeature.WRITE_ENUMS_TO_LOWERCASE));
340+
}
341+
342+
public void testEnumFeature_WRITE_ENUMS_TO_LOWERCASE() throws Exception {
343+
ObjectMapper m = jsonMapperBuilder()
344+
.configure(EnumFeature.WRITE_ENUMS_TO_LOWERCASE, true)
345+
.build();
346+
assertEquals("\"b\"", m.writeValueAsString(TestEnum.B));
347+
348+
// [databind#749] but should also be able to dynamically disable
349+
assertEquals("\"B\"",
350+
m.writer().without(EnumFeature.WRITE_ENUMS_TO_LOWERCASE)
351+
.writeValueAsString(LowerCaseEnum.B));
352+
}
333353
}
334354

335355
// [JACKSON-757], non-inner enum

src/test/java/com/fasterxml/jackson/databind/util/EnumValuesTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.databind.ObjectMapper;
77
import com.fasterxml.jackson.databind.SerializationConfig;
88
import com.fasterxml.jackson.databind.SerializationFeature;
9+
import com.fasterxml.jackson.databind.cfg.EnumFeature;
910

1011
public class EnumValuesTest extends BaseMapTest
1112
{
@@ -64,4 +65,17 @@ public void testEnumResolver()
6465
assertEquals(ABC.B, enums.get(1));
6566
assertEquals(ABC.C, enums.get(2));
6667
}
68+
69+
@SuppressWarnings("unchecked")
70+
public void testConstructFromNameLowerCased() {
71+
SerializationConfig cfg = MAPPER.getSerializationConfig()
72+
.with(EnumFeature.WRITE_ENUMS_TO_LOWERCASE);
73+
Class<Enum<?>> enumClass = (Class<Enum<?>>)(Class<?>) ABC.class;
74+
EnumValues values = EnumValues.construct(cfg, enumClass);
75+
assertEquals("a", values.serializedValueFor(ABC.A).toString());
76+
assertEquals("b", values.serializedValueFor(ABC.B).toString());
77+
assertEquals("c", values.serializedValueFor(ABC.C).toString());
78+
assertEquals(3, values.values().size());
79+
assertEquals(3, values.internalMap().size());
80+
}
6781
}

0 commit comments

Comments
 (0)