json - lista - ¿Por qué Jackson también está serializando un miembro transitorio?
libreria json para java (3)
Estoy serializando un POJO en JSON usando Jackson 2.1.4 pero quiero ignorar que un campo en particular no se serialice. Utilicé transitorio pero todavía está serializando ese elemento.
public class TestElement {
int x;
private transient String y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
}
Estoy serializando como sigue:
public static void main(String[] args) throws JsonProcessingException {
TestElement testElement = new TestElement();
testElement.setX(10);
testElement.setY("adasd");
ObjectMapper om = new ObjectMapper();
String serialized = om.writeValueAsString(testElement);
System.err.println(serialized);
}
No sugiera @JsonIgnore
ya que no quiero vincular mi modelo a las anotaciones específicas de jackson. ¿Se puede hacer usando solo transitorio? ¿Hay alguna API en objectmapper para la configuración de visibilidad?
La razón por la que Jackson serializa el miembro transient
es porque los captadores se utilizan para determinar qué serializar, no el miembro en sí, y como tiene un captador público, se serializa. Si desea cambiar ese valor predeterminado y hacer que Jackson use campos, simplemente haga lo siguiente:
om.setVisibilityChecker(
om.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE));
Otra forma de ignorar una propiedad en la serialización es hacerlo directamente en la clase:
@JsonIgnoreProperties(value = { "y" })
public class TestElement {
...
Y otra forma es directamente en el campo:
public class TestElement {
@JsonIgnore
private String y;
...
Espero que esto ayude.
No puedo hacer comentarios, así que complete la respuesta anterior aquí, cambiando (ahora) el método obsoleto setVisibilityChecker
y agregando una cláusula faltante para los booleanos:
mapper.setVisibility(
mapper.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE).
withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
);
Una nueva forma de evitar que Jackson se mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
y deserialice es llamar a mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
.