es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice JsonSerialize para tipos de Java a nivel de clase.

Tengo una clase Response con múltiples valores de tipo Double. Se ve algo así:

class Data {
   private Double number1;
   private Double number2;
   private Double number3;
   private Double number4;

   // Getters y Setters ...
}

Quiero usar esta clase para enviar una respuesta a un servicio Spring REST, sin embargo, necesito formatear los valores Double de una manera específica (algo como 23,45,276.10).

Puedo lograr esto cambiando los tipos a String y estableciéndolos a través de java.text.DecimalFormat o mediante el uso de la anotación JsonSerialize en cada campo.

Pero ¿hay alguna forma en la que pueda definir esto a nivel de clase, o mejor aún, a nivel de solicitud? Anotar cada variable Double individualmente es algo que quiero evitar.

¿Existe alguna configuración/anotación global o a nivel de clase que pueda ayudarme a convertir todos los elementos Double en un formato específico?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de definir el formato de los valores Double a nivel de clase o a nivel de solicitud. Puedes utilizar el ObjectMapper de Jackson y escribir un JsonSerializer para el tipo Double. Esto se puede configurar a nivel global o a nivel de solicitud.

    Aquí tienes un ejemplo de cómo escribir un JsonSerializer personalizado para el tipo Double:

    public class CustomDoubleSerializer extends JsonSerializer<double> {
    
        private final DecimalFormat decimalFormat;
    
        public CustomDoubleSerializer(String pattern) {
            decimalFormat = new DecimalFormat(pattern);
        }
    
        @Override
        public void serialize(Double value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                throws IOException {
            if (value != null) {
                jsonGenerator.writeString(decimalFormat.format(value));
            } else {
                jsonGenerator.writeNull();
            }
        }
    }
    

    En este ejemplo, estamos utilizando la clase DecimalFormat para formatear el valor Double. El patrón pasado al constructor se puede personalizar según tus necesidades de formato específicas.

    Para usar este serializador a nivel global, puedes agregar lo siguiente a la configuración de tu ObjectMapper:

    SimpleModule customDoubleModule = new SimpleModule();
    customDoubleModule.addSerializer(Double.class, new CustomDoubleSerializer("###,##0.00"));
    objectMapper.registerModule(customDoubleModule);
    

    Esto registrará el serializador personalizado para todos los valores Double en tu aplicación.

    Para usar este serializador a nivel de solicitud, puedes agregar la siguiente anotación a tu método de controlador:

    @JsonSerialize(using = CustomDoubleSerializer.class)
    public ResponseEntity<data> getData() {
        ...
    }
    

    Esto utilizará el serializador personalizado solo para los valores Double devueltos por este método de controlador.

    Al usar este enfoque, puedes evitar anotar cada variable Double individual y, en su lugar, definir el formato a un nivel más alto.

Comments are closed.