java - example - ¿Cómo hago para que Jackson no serialice las primitivas con el valor predeterminado?
objectmapper java (2)
En Jackson, es posible utilizar la anotación JsonSerialize en un POJO para evitar la serialización de objetos nulos (@JsonSerialize (include = JsonSerialize.Inclusion.NON_NULL)). Las primitivas, sin embargo, no se pueden establecer como nulas, por lo que esta anotación no funciona para algo como un int que no se ha tocado y está predeterminado en 0.
¿Hay alguna anotación que me permita decir algo como "Para esta clase, no serialice las primitivas a menos que sean diferentes a sus valores predeterminados" o "Para este campo, no lo serialice si su valor es X"?
El hecho es que en Java el cargador de clases establecerá en el valor predeterminado todas las propiedades primitivas no inicializadas (int = 0, booleano = falso, etc.), por lo que no podrá distinguirlas de las establecidas explícitamente por su aplicación. En mi opinión, tienes dos opciones:
- Utilice los objetos correspondientes de envoltura en lugar de primitivos (Integer, Boolean, Long ..)
- Como ya se sugirió, defina un serializador personalizado
Si está utilizando una versión reciente de Jackson, puede usar JsonInclude.Include.NON_DEFAULT
que debería funcionar para primitivos.
La desventaja de este enfoque es que establecer una propiedad de bean a su valor predeterminado no tendrá ningún efecto y la propiedad aún no se incluirá:
@JsonInclude(Include.NON_DEFAULT)
public class Bean {
private int val;
public int getVal() { return val; }
public void setVal(int val) { this.val = val; }
}
Bean b = new Bean();
b.setVal(0);
new ObjectMapper().writeValueAsString(b); // "{}"