Как указать джексон использовать только поля - желательно в глобальном масштабе
По умолчанию поведение джока, похоже, использует оба свойства (геттеры и сеттеры) и поля для сериализации и десериализации для 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).