Как заставить Джексона игнорировать метод get() при сериализации объекта
У меня этот код в классе с именем Project
:
@Transient
public List<Release> getAllReleases() {
List<Release> releases = new ArrayList<Release>();
...
return releases;
}
Когда объект проекта сериализуется, вызывается метод getAllReleases()
, и к сериализованному объекту добавляется поле allReleases
.
Если я добавлю @JsonIgnore
до того, как метод получит тот же результат. Поэтому мне интересно, как я могу реализовать метод getFoo()
, который игнорируется Джексоном при сериализации объекта.
В качестве альтернативы я мог бы сделать:
static public List<Release> getAllReleases(Project proj) {
List<Release> releases = new ArrayList<Release>();
...
return releases;
}
но решение выглядит немного уродливо, и я уверен, что должен быть какой-то более простой механизм, предоставляемый Джексоном.
Я что-то упустил? ТИА
Ответы
Ответ 1
Если вы отметите метод getter с аннотацией @JsonIgnore
, он не должен быть сериализован. Вот пример:
public class JacksonIgnore {
public static class Release {
public final String version;
public Release(String version) {
this.version = version;
}
}
public static class Project {
public final String name;
public Project(String name) {
this.name = name;
}
@JsonIgnore
public List<Release> getAllReleases() {
return Arrays.asList(new Release("r1"), new Release("r2"));
}
}
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new Project("test")));
}
}
Выход:
{
"name" : "test"
}
Ответ 2
Вам нужно реализовать JSon-сериализатор, который ничего не делает, а затем устанавливает его с помощью @JSonSerialize (используя = EmptySerializer.class).
Нажмите на ссылку для дальнейшего примера.
Ссылка: Джексон: как предотвратить сериализацию поля