Skip to content

Commit

Permalink
Feature : add EnumFeature.WRITE_ENUMS_TO_LOWERCASE #3053 #3054 (#3776)
Browse files Browse the repository at this point in the history
  • Loading branch information
JooHyukKim authored Feb 10, 2023
1 parent 6c8c151 commit 0f0d04c
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 2 deletions.
12 changes: 10 additions & 2 deletions src/main/java/com/fasterxml/jackson/databind/cfg/EnumFeature.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,16 @@ public enum EnumFeature implements DatatypeFeature
*
* @since 2.15
*/
READ_ENUM_KEYS_USING_INDEX(false)
;
READ_ENUM_KEYS_USING_INDEX(false),

/**
* Feature that determines standard serialization mechanism used for
* Enum values: if enabled, return value of <code>Enum.name().toLowerCase()</code>
* is used; if disabled, return value of <code>Enum.name()</code> is used.
*<p>
* Feature is disabled by default.
*/
WRITE_ENUMS_TO_LOWERCASE(false);

private final static int FEATURE_INDEX = DatatypeFeatures.FEATURE_INDEX_ENUM;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.fasterxml.jackson.core.SerializableString;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.cfg.EnumFeature;
import com.fasterxml.jackson.databind.cfg.MapperConfig;

/**
Expand Down Expand Up @@ -56,6 +57,9 @@ public static EnumValues constructFromName(MapperConfig<?> config, Class<Enum<?>
if (name == null) {
name = en.name();
}
if (config.isEnabled(EnumFeature.WRITE_ENUMS_TO_LOWERCASE)) {
name = name.toLowerCase();
}
textual[en.ordinal()] = config.compileString(name);
}
return construct(enumClass, textual);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.cfg.EnumFeature;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
Expand Down Expand Up @@ -330,6 +331,25 @@ public void testEnumWithJsonKey() throws Exception
= Collections.singletonMap(EnumWithJsonKey.A, EnumWithJsonKey.B);
assertEquals(a2q("{'key:a':'value:b'}"), MAPPER.writeValueAsString(input2));
}

public void testEnumFeature_WRITE_ENUMS_TO_LOWERCASE_isDisabledByDefault() {
ObjectReader READER = MAPPER.reader();
assertFalse(READER.isEnabled(EnumFeature.WRITE_ENUMS_TO_LOWERCASE));
assertFalse(READER.without(EnumFeature.WRITE_ENUMS_TO_LOWERCASE)
.isEnabled(EnumFeature.WRITE_ENUMS_TO_LOWERCASE));
}

public void testEnumFeature_WRITE_ENUMS_TO_LOWERCASE() throws Exception {
ObjectMapper m = jsonMapperBuilder()
.configure(EnumFeature.WRITE_ENUMS_TO_LOWERCASE, true)
.build();
assertEquals("\"b\"", m.writeValueAsString(TestEnum.B));

// [databind#749] but should also be able to dynamically disable
assertEquals("\"B\"",
m.writer().without(EnumFeature.WRITE_ENUMS_TO_LOWERCASE)
.writeValueAsString(LowerCaseEnum.B));
}
}

// [JACKSON-757], non-inner enum
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.cfg.EnumFeature;

public class EnumValuesTest extends BaseMapTest
{
Expand Down Expand Up @@ -64,4 +65,17 @@ public void testEnumResolver()
assertEquals(ABC.B, enums.get(1));
assertEquals(ABC.C, enums.get(2));
}

@SuppressWarnings("unchecked")
public void testConstructFromNameLowerCased() {
SerializationConfig cfg = MAPPER.getSerializationConfig()
.with(EnumFeature.WRITE_ENUMS_TO_LOWERCASE);
Class<Enum<?>> enumClass = (Class<Enum<?>>)(Class<?>) ABC.class;
EnumValues values = EnumValues.construct(cfg, enumClass);
assertEquals("a", values.serializedValueFor(ABC.A).toString());
assertEquals("b", values.serializedValueFor(ABC.B).toString());
assertEquals("c", values.serializedValueFor(ABC.C).toString());
assertEquals(3, values.values().size());
assertEquals(3, values.internalMap().size());
}
}

0 comments on commit 0f0d04c

Please sign in to comment.