как указать Джексону использовать только поля-желательно глобально



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



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



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



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


но я не хочу, чтобы это было на каждом классе...



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

621   5  

5 ответов:

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

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

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

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

специально для 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);

не работает для моего логического геттера / сеттера. Решение достаточно просто:

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

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

ObjectMapper mapper = new ObjectMapper();

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

для поворота автоматического выделения.

как насчет этого: я использовал его с 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);

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

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

Comments

    Ничего не найдено.