Le comportement par défaut de Jackon semble utiliser à la fois des propriétés (getters et setters) et des champs pour se sérialiser et se désérialiser en json.
Je voudrais utiliser les champs comme source canonique de configuration de sérialisation et je ne veux donc pas que Jackson regarde les propriétés du tout.
Je peux le faire sur une base de classe individuelle avec l'annotation:
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
Mais je ne veux pas avoir à mettre cela sur chaque classe ...
Est-il possible de configurer ceci globalement? Vous souhaitez en ajouter au mappeur d'objets?
Vous pouvez configurer des ObjectMappers individuels comme ceci:
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 vous souhaitez le définir globalement, j'accède généralement à un mappeur configuré via une classe wrapper.
Dans Jackson 2.0 et versions ultérieures, vous pouvez simplement utiliser:
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);
désactiver la détection automatique.
Spécifiquement pour boolean is*()
getters:
J'ai passé beaucoup de temps sur pourquoi ni ci-dessous
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
ni cela
setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
travaillé pour mon Getter/Setter Booléen.
La solution est simple:
@JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...
setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
UPDATE: spring-boot autorisé à le configurer:
jackson:
visibility.field: any
visibility.getter: none
visibility.setter: none
visibility.is-getter: none
pour jackson 1.9.10 j'utilise
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(JsonMethod.ALL, Visibility.NONE);
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
désactiver la détection automatique.
Que diriez-vous de cela: je l'ai utilisé avec un mixin
objet non 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 {}
Usage:
ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class);
Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class);
Il n'y a rien qui indique que vous ne pouvez pas accéder à plusieurs classes et appliquer le même mixin.
Si vous n'êtes pas familier avec les mixins, ils sont simplement conceptuels: La structure du mixin est super imposée sur la classe cible (selon jackson, pas en ce qui concerne la JVM).