serialize example java json jackson

java - example - cómo especificar que jackson use solo campos, de preferencia globalmente



objectmapper java (5)

El comportamiento predeterminado de jackon parece usar tanto propiedades (getters y setters) como campos para serializar y deserializar a json.

Me gustaría utilizar los campos como fuente canónica de configuración de serialización y, por lo tanto, no quiero que jackson mire propiedades.

Puedo hacer esto en una base de clase individual con la anotación:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

Pero no quiero tener que poner esto en cada clase ...

¿Es posible configurar esto globalmente? ¿Como agregar algo al Object Mapper?


¿Qué tal esto? Lo usé con un mixin

objeto no conforme

@Entity @Getter @NoArgsConstructor public class Telemetry { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long pk; private String id; private String organizationId; private String baseType; private String name; private Double lat; private Double lon; private Instant updateTimestamp; }

Mixin:

@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE) public static class TelemetryMixin {}

Uso:

ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class); Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class);

No hay nada que diga que no se puede lograr ninguna cantidad de clases y aplicar el mismo mixin.

Si no estás familiarizado con mixins, son conceptualmente simples: la estructura de la mixin está súper impuesta en la clase objetivo (según jackson, no en lo que se refiere a la JVM).


En Jackson 2.0 y versiones posteriores, simplemente puede usar:

import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; ... ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE); mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

para desactivar la autodetección


He pasado mucho tiempo: ¿por qué

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

no

setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE); setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

no funciona para mi boolean getter / setter. La solución es simpe:

@JsonAutoDetect(isGetterVisibility = Visibility.NONE, ... setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);


Puede configurar ObjectMappers individuales de esta manera:

ObjectMapper mapper = new ObjectMapper(); mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker() .withFieldVisibility(JsonAutoDetect.Visibility.ANY) .withGetterVisibility(JsonAutoDetect.Visibility.NONE) .withSetterVisibility(JsonAutoDetect.Visibility.NONE) .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

Si quiere que se configure globalmente, generalmente accedo a un mapeador configurado a través de una clase contenedora.


para jackson 1.9.10 que uso

ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(JsonMethod.ALL, Visibility.NONE); mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

para cambiar la autodedección