как указать Джексона, чтобы использовать только поля - желательно глобально - PullRequest
170 голосов
/ 18 августа 2011

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

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

Я могу сделать это на индивидуальной основе с аннотацией:

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

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

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

Ответы [ 5 ]

141 голосов
/ 18 августа 2011

Вы можете настроить отдельные 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));

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

139 голосов
/ 21 ноября 2012

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

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

32 голосов
/ 20 июля 2014

Специально для boolean is*() геттеров:

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

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

работал для моего Boolean Getter / Setter.

Решение простое:

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

ОБНОВЛЕНИЕ: пружинная загрузка позволила настроить его:

jackson:
  visibility.field: any
  visibility.getter: none
  visibility.setter: none
  visibility.is-getter: none

См. Общие свойства приложения # JACKSON

12 голосов
/ 27 февраля 2014

для Джексона 1.9.10 Я использую

ObjectMapper mapper = new ObjectMapper();

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

для поворота автоопределения.

10 голосов
/ 21 декабря 2016

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...