Вы можете создать класс, который расширяется от класса Foo
, чтобы предложить альтернативную сериализацию для fooList
, используя аннотацию @JsonGetter
, как обертку.
Foo
class:
public class Foo implements Serializable {
private int id;
private List<Foo> fooList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Foo> getFooList() {
return fooList;
}
public void setFooList(List<Foo> fooList) {
this.fooList = fooList;
}
}
Bar
class:
public class Bar implements Serializable {
public List<FooJsonSimplifiedSerializationWrapper> fooList;
public List<FooJsonSimplifiedSerializationWrapper> getFooList() {
return fooList;
}
public void setFooList(List<FooJsonSimplifiedSerializationWrapper> fooList) {
this.fooList = fooList;
}
}
FooFooJsonSimplifiedSerializationWrapper
- это оболочка Foo
для сериализации, и у нее есть метод для преобразования из Lst<Foo>
в List <<code>FooFooJsonSimplifiedSerializationWrapper>, который выперед сериализацией придется позвонить в какой-то момент:
public class FooJsonSimplifiedSerializationWrapper extends Foo {
@JsonGetter("fooList")
public List<Integer> serializeFooList() {
return this.getFooList().stream().map(f -> f.getId()).collect(Collectors.toList());
}
public static List<FooJsonSimplifiedSerializationWrapper> convertFromFoo(List<Foo> fooList) {
return fooList.stream().map(f -> {
FooJsonSimplifiedSerializationWrapper fooSimplified = new FooJsonSimplifiedSerializationWrapper();
BeanUtils.copyProperties(f, fooSimplified);
return fooSimplified;
}).collect(Collectors.toList());
}
}
Main
с некоторыми тестами:
public static void main(String[] args) throws IOException {
Foo foo = new Foo();
foo.setId(1);
Foo fooChild = new Foo();
fooChild.setId(2);
fooChild.setFooList(new ArrayList<>());
Foo fooChild2 = new Foo();
fooChild2.setId(3);
fooChild2.setFooList(new ArrayList<>());
foo.setFooList(Arrays.asList(fooChild, fooChild2));
Bar bar = new Bar();
bar.setFooList(FooJsonSimplifiedSerializationWrapper.convertFromFoo(Arrays.asList(foo)));
System.out.println(new ObjectMapper().writeValueAsString(foo));
System.out.println(new ObjectMapper().writeValueAsString(bar));
}
Этот код напечатает:
Foo serialization: {"id":1,"fooList":[{"id":2,"fooList":[]},{"id":3,"fooList":[]}]}
Bar serialization: {"fooList":[{"id":1,"fooList":[2,3]}]}
Другое решение может включать использование Views
с аннотацией @JsonView
и настройку представлений для адаптации сериализации к вашим потребностям, но, на мой взгляд, это более громоздкое решение.