Джексон сериализует только методы интерфейса
У меня есть один объект A с некоторыми методами ma, mb, mc, и этот объект реализует интерфейс B только с ma и mb.
Когда я сериализую B, я ожидаю только ma и mb как ответ json, но я получаю также mc.
Я хотел бы автоматизировать это поведение, чтобы все классы, которые я сериализую, сериализуются на основе интерфейса, а не реализации.
Как мне это сделать?
Пример:
public interface Interf {
public boolean isNo();
public int getCountI();
public long getLonGuis();
}
Реализация:
public class Impl implements Interf {
private final String patata = "Patata";
private final Integer count = 231321;
private final Boolean yes = true;
private final boolean no = false;
private final int countI = 23;
private final long lonGuis = 4324523423423423432L;
public String getPatata() {
return patata;
}
public Integer getCount() {
return count;
}
public Boolean getYes() {
return yes;
}
public boolean isNo() {
return no;
}
public int getCountI() {
return countI;
}
public long getLonGuis() {
return lonGuis;
}
}
Сериализация:
ObjectMapper mapper = new ObjectMapper();
Interf interf = new Impl();
String str = mapper.writeValueAsString(interf);
System.out.println(str);
Ответ:
{
"patata": "Patata",
"count": 231321,
"yes": true,
"no": false,
"countI": 23,
"lonGuis": 4324523423423423500
}
Ожидаемый ответ:
{
"no": false,
"countI": 23,
"lonGuis": 4324523423423423500
}
Ответы
Ответ 1
Просто комментируйте свой интерфейс таким образом, чтобы Джексон строит поля данных в соответствии с классом интерфейса, а не базовым классом объектов.
@JsonSerialize(as=Interf.class)
public interface Interf {
public boolean isNo();
public int getCountI();
public long getLonGuis();
}
Ответ 2
У вас есть два варианта:
1) поместите аннотацию @JsonSerialize
в свой интерфейс (см. @ответ broc.seib)
2) или использовать определенный писатель для сериализации (по состоянию на Джексона 2.9.6):
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writerFor(Interf.class).writeValueAsString(interf);
Ответ 3
Решение не сработало для меня. Не могли бы вы мне помочь?
Мой интерфейс:
@JsonSerialize(as = ProjectionAgenda.class)
//@JsonTypeInfo(use = NAME, include = WRAPPER_OBJECT)
//@JsonSubTypes({@JsonSubTypes.Type(value = Agenda.class, name = "Object;")})
public interface ProjectionAgenda {
Long getId();
String getResumo();
String getCompromisso();
@JsonFormat(pattern = "dd/MM/yyyy")
Timestamp getInicio();
@JsonFormat(pattern = "HH:mm")
Timestamp getHora();
@JsonFormat(pattern = "dd/MM/yyyy")
Timestamp getFim();
String getLocal();
}
Вывод new ObjectMapper().writeValueAsString(entity)
[[16678,"text in herer","text in here",1508436000000,1508446800000,"text in here",1508436000000]
.... другие. Сущность Beacause - это ArrayList ProjectionAgenda.
Виды.
Ответ 4
если сериализованный класс (в вашем случае: Impl.class) происходит из внешней библиотеки, поэтому я не могу добавить к нему какие-либо аннотации.
как мне это сделать?