как указать Джексону использовать только поля-желательно глобально
поведение jackon по умолчанию, похоже, использует как свойства (геттеры и сеттеры), так и поля для сериализации и десериализации в json.
Я хотел бы использовать поля в качестве канонического источника конфигурации сериализации и, следовательно, не хочу, чтобы Джексон вообще смотрел на свойства.
Я могу сделать это на индивидуальной основе класса с аннотацией:
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
но я не хочу, чтобы это было на каждом классе...
можно ли настраивать это глобально? Как добавить некоторые в объект Mapper?
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