comment spécifier jackson pour n’utiliser que des champs – de préférence globalement

Le comportement de jackon par défaut semble utiliser à la fois les propriétés (getters et setters) et les champs pour sérialiser et désérialiser en json.

Je voudrais utiliser les champs comme source canonique de la configuration de sérialisation et je ne veux donc pas que jackson examine les propriétés.

Je peux le faire en classe individuelle avec l’annotation:

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

Mais je ne veux pas mettre ça sur toutes les classes …

Est-il possible de configurer cela globalement? Comme append un object au Object Mapper?

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 voulez qu’il soit défini 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); 

pour désactiver l’autodétection.

Spécifiquement pour boolean is*() getters:

J’ai passé beaucoup de temps: pourquoi ni

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

non

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

ne fonctionne pas pour mon getter / setter booléen. La solution est simple:

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

pour le jackson 1.9.10 j’utilise

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

de tourner la déduction automatique.

Que diriez-vous de ça: je l’ai utilisé avec un mixin

object non conforme

 @Entity @Getter @NoArgsConstructor public class Telemetry { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long pk; private Ssortingng id; private Ssortingng organizationId; private Ssortingng baseType; private Ssortingng 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[] telemesortinges = om.readValue(someJson, Telemetry[].class); 

Il n’y a rien qui indique que vous ne pouviez pas utiliser un certain nombre de classes et appliquer le même mixin.

Si vous n’êtes pas familier avec les mixins, ils sont conceptuellement simples: la structure du mixin est superposée à la classe cible (selon jackson, pas en ce qui concerne la JVM).