web-dev-qa-db-fra.com

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

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?

170
Michael Wiles

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.

141
Tim Helmstedt

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.

140
lukk

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

Voir propriétés d'application communes # JACKSON

34
GKislin

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.

13
mfe

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).

10
Christian Bongiorno