Джексон сериализует только методы интерфейса

У меня есть один объект 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) происходит из внешней библиотеки, поэтому я не могу добавить к нему какие-либо аннотации.

как мне это сделать?