From eeb25cbdb2a31088f125114ab57c702b2f80a902 Mon Sep 17 00:00:00 2001 From: iProdigy Date: Fri, 14 Jul 2023 17:00:33 -0500 Subject: [PATCH] feat(ser): use JsonProperty over EnumNamingStrategy --- .../databind/ser/std/EnumSerializer.java | 2 +- .../jackson/databind/util/EnumValues.java | 38 +++++++++++++++++++ .../ser/jdk/EnumNamingSerializationTest.java | 15 ++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java index 6e8e192082..2d804b70b9 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java @@ -275,6 +275,6 @@ protected static EnumValues constructEnumNamingStrategyValues(SerializationConfi EnumNamingStrategy enumNamingStrategy = EnumNamingStrategyFactory.createEnumNamingStrategyInstance( namingDef, config.canOverrideAccessModifiers()); return enumNamingStrategy == null ? null : EnumValues.constructUsingEnumNamingStrategy( - config, enumClass, enumNamingStrategy); + config, annotatedClass, enumNamingStrategy); } } diff --git a/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java b/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java index 37a14d6e6f..5ee9697647 100644 --- a/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java +++ b/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java @@ -118,6 +118,42 @@ public static EnumValues constructFromToString(MapperConfig config, Class + * The output {@link EnumValues} should contain values that are symmetric to + * {@link EnumResolver#constructUsingEnumNamingStrategy(DeserializationConfig, AnnotatedClass, EnumNamingStrategy)}. + * + * @since 2.16 + */ + public static EnumValues constructUsingEnumNamingStrategy(MapperConfig config, AnnotatedClass annotatedClass, + EnumNamingStrategy namingStrategy) + { + // prepare data + final AnnotationIntrospector ai = config.getAnnotationIntrospector(); + final Class enumCls0 = annotatedClass.getRawType(); + final Class> enumCls = _enumClass(enumCls0); + final Enum[] enumConstants = _enumConstants(enumCls0); + + // introspect + String[] names = new String[enumConstants.length]; + if (ai != null) { + ai.findEnumValues(config, annotatedClass, enumConstants, names); + } + + // build + SerializableString[] textual = new SerializableString[enumConstants.length]; + for (int i = 0, len = enumConstants.length; i < len; i++) { + Enum enumValue = enumConstants[i]; + String name = names[i]; + if (name == null) { + name = namingStrategy.convertEnumToExternalName(enumValue.name()); + } + textual[i] = config.compileString(name); + } + return construct(enumCls, textual); + } + /** * Returns String serializations of Enum name using an instance of {@link EnumNamingStrategy}. * @@ -125,7 +161,9 @@ public static EnumValues constructFromToString(MapperConfig config, Class config, Class> enumClass, EnumNamingStrategy namingStrategy) { Class> cls = ClassUtil.findEnumType(enumClass); Enum[] values = cls.getEnumConstants(); diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/jdk/EnumNamingSerializationTest.java b/src/test/java/com/fasterxml/jackson/databind/ser/jdk/EnumNamingSerializationTest.java index 160c45818f..558deb3cae 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ser/jdk/EnumNamingSerializationTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/ser/jdk/EnumNamingSerializationTest.java @@ -48,6 +48,13 @@ static enum EnumFlavorD { PEANUT_BUTTER } + @EnumNaming(EnumNamingStrategies.CamelCaseStrategy.class) + static enum EnumFlavorE { + PEANUT_BUTTER, + @JsonProperty("almond") + ALMOND_BUTTER + } + static class EnumFlavorWrapperBean { public EnumSauceB sauce; @@ -102,4 +109,12 @@ public void testDesrEnumWithEnumMap() throws Exception { assertEquals(a2q("{'mayoNezz':'value'}"), str); } + + public void testEnumNamingStrategyWithOverride() throws Exception { + String almond = MAPPER.writeValueAsString(EnumFlavorE.ALMOND_BUTTER); + assertEquals(q("almond"), almond); + + String peanut = MAPPER.writeValueAsString(EnumFlavorE.PEANUT_BUTTER); + assertEquals(q("peanutButter"), peanut); + } }