Как указать джексон использовать только поля - желательно в глобальном масштабе

По умолчанию поведение джока, похоже, использует оба свойства (геттеры и сеттеры) и поля для сериализации и десериализации для json.

Я хотел бы использовать поля в качестве канонического источника конфигурации сериализации и, таким образом, не хочу, чтобы джексон вообще смотрел на свойства.

Я могу сделать это на основе отдельного класса с помощью аннотации:

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

Но я не хочу ставить это на каждый класс...

Можно ли настроить это глобально? Как добавить некоторые из объектов Mapper?

Ответ 1

Вы можете настроить отдельные объекты ObjectMappers следующим образом:

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

Если вы хотите, чтобы он был установлен глобально, я обычно обращаюсь к сконфигурированному картографу через класс-оболочку.

Ответ 2

В Jackson 2.0 и более поздних версиях вы можете просто использовать:

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

чтобы отключить автоопределение.

Ответ 3

В частности, для boolean is*() getters:

Я потратил много времени: почему ни

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

нет

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

не работает для моего булевого getter/setter. Решение - simpe:

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

Ответ 4

для jackson 1.9.10 Я использую

ObjectMapper mapper = new ObjectMapper();

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

чтобы включить автоматическое определение.

Ответ 5

Как насчет этого: я использовал его с mixin

несовместимый объект

@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 {}

Использование:

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

Нет ничего, что говорило бы, что вы не можете предусмотреть любое количество классов и применить тот же mixin.

Если вы не знакомы с миксинами, они концептуально просто: структура mixin супер наложена на целевой класс (по словам Джексона, а не на JVM).