como especificar jackson para usar somente campos – de preferência globalmente

O comportamento padrão de jackon parece usar as duas propriedades (getters e setters) e os campos para serializar e desserializar para json.

Eu gostaria de usar os campos como a fonte canônica da configuração de serialização e, portanto, não quero que o Jackson olhe para as propriedades.

Eu posso fazer isso em uma base de class individual com a anotação:

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

Mas eu não quero ter que colocar isso em todas as aulas …

É possível configurar isso globalmente? Como adicionar alguns para o mapeador de objects?

   

Você pode configurar ObjectMappers individuais assim:

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

Se você quiser que ele seja definido globalmente, normalmente, access um mapeador configurado através de uma class de wrapper.

Em Jackson 2.0 e posterior, você pode simplesmente 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 desativar a autodetecção.

Especificamente para boolean is*() getters:

Eu gastei muito tempo: porque nem

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

não

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

não funciona para o meu getter / setter booleano. A solução é simpe:

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

para jackson 1.9.10 eu uso

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

para virar de dedicação automática.

Que tal isso: eu usei com um mixin

object não 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); 

Não há nada que diga que você não poderia alcançar qualquer número de classs e aplicar o mesmo mixin.

Se você não está familiarizado com mixins, eles são conceitualmente simples: a estrutura do mixin é super imposta na class alvo (de acordo com jackson, não no que diz respeito à JVM).