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.

La deserialización de Jackson con @JsonUnwrapped

Tengo las siguientes clases:

public class Request {
   public String name;

   @JsonUnwrapped
   @JsonInclude(JsonInclude.Include.NON_NULL)
   public DateOfBirth dateOfBirth;
}

public class DateOfBirth {
   public int day;
   public int month;
   public int year;
}

{
  "name" : "John Doe"
}

La deserialización de este JSON crea un objeto Request con name igual a “John Doe” y dateOfBirth con los valores de día, mes y año en 0.
¿Cómo puedo anular este comportamiento para que dateOfBirth sea nulo?

Vale la pena mencionar que si se elimina la anotación @JsonUnwrapped, este tipo de JSON se deserializa como un objeto nulo, por lo que siento que me estoy perdiendo algún truco aquí.
Versión de Jackson – 2.13.1

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para anular este comportamiento y hacer que dateOfBirth sea nulo en lugar de tener el día, mes y año como 0, puedes agregar la anotación JsonSetter al campo dateOfBirth en la clase Request de la siguiente manera:

    public class Request {
       public String name;
    
       @JsonUnwrapped
       @JsonInclude(JsonInclude.Include.NON_NULL)
       private DateOfBirth dateOfBirth;
    
       @JsonSetter
       public void setDateOfBirth(DateOfBirth dob) {
           if (dob.day == 0 && dob.month == 0 && dob.year == 0) {
               this.dateOfBirth = null;
           } else {
               this.dateOfBirth = dob;
           }
       }
    }
    

    Esto establece un método personalizado de deserialización para el campo dateOfBirth que verifica si los campos de día, mes y año son todos 0. Si lo son, entonces dateOfBirth se establece como nulo. Si no lo son, entonces dateOfBirth se establece como el objeto DateOfBirth deserializado.

Comments are closed.