When I serialize / deserialize any object, all field names are converted to lowercase. Is there any configuration that forces Jackson to save field names exactly as they are? Both for serialization and for deserialization?
(I know about @JsonProperty, but that doesn't seem right, as I only need Jackson to respect what already exists)
My test code is:
import java.io.Serializable; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.cfg.MapperConfig; import com.fasterxml.jackson.databind.introspect.AnnotatedField; import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; public class Test { static class Example implements Serializable { private String Test; private String ABC; private String XyZ; public String getTest() { return Test; } public void setTest(String test) { Test = test; } public String getABC() { return ABC; } public void setABC(String abc) { ABC = abc; } public String getXyZ() { return XyZ; } public void setXyZ(String xyz) { XyZ = xyz; } } static class MyPropertyNamingStrategy extends PropertyNamingStrategy { @Override public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) { return convert(defaultName); } @Override public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { return convert(defaultName); } @Override public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { return convert(defaultName); } private String convert(String input) { return input; } } public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper() .setPropertyNamingStrategy(new MyPropertyNamingStrategy()) .enable(SerializationFeature.INDENT_OUTPUT) .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
Thanks to @ BlueLettuce16, I was able to create an βimprovedβ version of PropertyNamingStrategy . There he is:
import java.lang.reflect.Modifier; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.cfg.MapperConfig; import com.fasterxml.jackson.databind.introspect.AnnotatedField; import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; public class CustomPropertyNamingStrategy extends PropertyNamingStrategy { @Override public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) { return convertForField(defaultName); } @Override public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { return convertForMethod(method, defaultName); } @Override public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { return convertForMethod(method, defaultName); } private String convertForField(String defaultName) { return defaultName; } private String convertForMethod(AnnotatedMethod method, String defaultName) { if (isGetter(method)) { return method.getName().substring(3); } if (isSetter(method)) { return method.getName().substring(3); } return defaultName; } private boolean isGetter(AnnotatedMethod method) { if (Modifier.isPublic(method.getModifiers()) && method.getGenericParameterTypes().length == 0) { if (method.getName().matches("^get[AZ].*") && !method.getGenericReturnType().equals(void.class)) return true; if (method.getName().matches("^is[AZ].*") && method.getGenericReturnType().equals(boolean.class)) return true; } return false; } private boolean isSetter(AnnotatedMethod method) { return Modifier.isPublic(method.getModifiers()) && method.getGenericReturnType().equals(void.class) && method.getGenericParameterTypes().length == 1 && method.getName().matches("^set[AZ].*"); } }
Barni source share