Aquí mi POJO
:
public class AutorDenormalized { private String id; private Long unitatId; private String grupId; private String descripcio; public AutorDenormalized() { } // getters $ setters }
Me gustaría serializar este tipo de objetos agregando un sufijo según el tipo de campo. Quiero decir,
*_s
*_l
¿Tienes alguna idea de cómo resolverlo?
Debe implementar un BeanPropertyWriter
personalizado que pueda generar un nombre de propiedad con un sufijo. Para registrar un BeanPropertyWriter
personalizado, debe crear un BeanSerializerModifier
personalizado.
El siguiente ejemplo muestra una implementación simplificada que muestra una forma de lograr el resultado anterior:
import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import com.fasterxml.jackson.databind.util.NameTransformer; import java.io.IOException; import java.util.List; public class JsonTypeInfoApp { public static void main(String[] args) throws IOException { SimpleModule typeSuffixModule = new SimpleModule(); typeSuffixModule.setSerializerModifier(new TypeSuffixBeanSerializerModifier()); ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); mapper.registerModule(typeSuffixModule); System.out.println(mapper.writeValueAsString(new AutorDenormalized())); } } class TypeSuffixBeanSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (int i = 0; i < beanProperties.size(); ++i) { final BeanPropertyWriter writer = beanProperties.get(i); Class<?> rawType = writer.getType().getRawClass(); if (supports(rawType)) { final String suffix = constructSuffix(rawType); beanProperties.set(i, writer.rename(NameTransformer.simpleTransformer(null, suffix))); } } return beanProperties; } private String constructSuffix(Class<?> rawType) { return "_" + Character.toLowerCase(rawType.getSimpleName().charAt(0)); } private boolean supports(Class<?> rawClass) { return rawClass == String.class || rawClass == Long.class; } }
El código anterior imprime:
{ "id_s" : "1", "unitatId_l" : 123, "grupId_s" : "2", "descripcio_s" : "3" }
Ver también:
Aparte de la respuesta aceptada, que funciona bien, también podría considerar implementar PropertyNameStrategy
: le permitiría cambiar el nombre de las propiedades y obtener el parámetro field, setter/getter, Creator (que necesita para encontrar el tipo de propiedad). Podría ser un poco menos de trabajo.