Почему Джексон также сериализует переходный член?
Я сериализую POJO в JSON, используя Jackson 2.1.4, но я хочу игнорировать конкретное поле из сериализации. Я использовал переходный процесс, но все же он сериализует этот элемент.
public class TestElement {
int x;
private transient String y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
}
Я сериализуюсь следующим образом:
public static void main(String[] args) throws JsonProcessingException {
TestElement testElement = new TestElement();
testElement.setX(10);
testElement.setY("adasd");
ObjectMapper om = new ObjectMapper();
String serialized = om.writeValueAsString(testElement);
System.err.println(serialized);
}
Пожалуйста, не предлагайте @JsonIgnore
, так как я не хочу привязывать свою модель к конкретным аннотациям Jackson. Можно ли это сделать только с помощью переходного процесса? Есть ли какой-либо API в объектной маске для настроек видимости?
Ответы
Ответ 1
Причина, по которой Джексон выполняет сериализацию члена transient
, объясняется тем, что геттеры используются для определения того, что сериализуется, а не самого члена, - и поскольку y
имеет публичный getter, который получает сериализацию.
Если вы хотите изменить это значение по умолчанию и использовать поля использования Джексона - просто выполните:
om.setVisibilityChecker(
om.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE));
Другой способ игнорировать свойство при сериализации - это сделать это непосредственно в классе:
@JsonIgnoreProperties(value = { "y" })
public class TestElement {
...
И другой способ находится непосредственно в поле:
public class TestElement {
@JsonIgnore
private String y;
...
Надеюсь, это поможет.
Ответ 2
Новый способ остановить Джексона от сериализации и десериализации - вызвать mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
.
Ответ 3
Я не могу комментировать так, чтобы завершить предыдущий ответ здесь, изменив (теперь) устаревший метод setVisibilityChecker
и добавив отсутствующее предложение для булевых:
mapper.setVisibility(
mapper.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE).
withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
);