O serializador customizado de Jackson serializa o campo duas vezes se o nome da propriedade não for igual ao nome do campo

Se você usar a serialização personalizada, poderá obter um efeito inesperado se o nome da propriedade não for igual ao nome do campo. Por que o campo é serializado duas vezes?

Meu exemplo de código:

class Mode {
    @JsonProperty("mode")
    @JsonSerialize(using = ModeSerializer.class)
    private boolean isPublic;

    public Mode(boolean isPublic) {
        this.isPublic = isPublic;
    }

    public boolean isPublic() {
        return isPublic;
    }
}

Aqui meu serializador de campo personalizado:

class ModeSerializer extends JsonSerializer<Boolean> {

        @Override
        public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
            String out = "private";
            if (value) {
                out = "public";
            }
            gen.writeString(out);
        }
    }

E aqui o teste:

public class Test {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Mode mode = new Mode(true);
        String toJson = mapper.writeValueAsString(mode);
        System.out.println(toJson);
    }
}

E, como resultado, recebo:

{"public":true,"mode":"public"}

O que estou fazendo errado?

questionAnswers(2)

yourAnswerToTheQuestion