Сериализация LocalDateTime с Джексоном приводит к тому, что поля присутствуют дважды - PullRequest
0 голосов
/ 24 июня 2019

У меня есть собственный класс сериализатора

public class LocalDateTimeSerializer extends StdSerializer<LocalDateTime>{
  @Override
    public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
        // custom code to serialize
        jgen.writeString(newValue);

    }

Я использую его, как показано ниже, для переменной класса:

@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime localDateTime;

Теперь, когда я сериализую это, это json, дата и время ответаСериализовано, как и ожидалось, согласно пользовательской логике.Все хорошо здесь.

Но есть некоторые случаи, когда поле отображается дважды без видимой причины.Переменная класса объявляется точно так же, чтобы сериализоваться с настраиваемым сериализатором, но выходные данные будут иметь два поля для переменной.Одним из них будет ожидаемое поле сериализации.Вторым будет не сериализованное поле.Посмотрите на следующий вывод:

"localDateTime": //as expected,
"localdateTime":{"year":2017,"month":"JUNE","monthValue":6,"dayOfMonth":29,"hour":20,"minute":0,"second":0,"nano":0,"dayOfWeek":"SATURDAY","dayOfYear":180,"chronology":{"calendarType":"iso8601","id":"ISO"}}

Это происходит случайно, скажем, для двух полей класса.

Есть идеи, что может вызвать это?

ОБНОВЛЕНИЕ:

Я думаю, что это было связано с тем, как метод получения / установки для объекта был назван.

@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime aOldDate;
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime aNewDate;



public LocalDateTime getaOldDate() {
    return aOldDate;
}
public void setaOldDate(LocalDateTime aOldDate) {
    this.aOldDate= aOldDate;
}

public LocalDateTime getANewDate() {
    return aNewDate;
}
public void setANewDate(LocalDateTime aNewDate) {
    this.aNewDate= aNewDate;
}

Если я попытаюсь сериализовать это, поле aNewDate будетприсутствует дважды в json, и aOldDate будет присутствовать один раз.Вероятно, это связано с тем, что «A» является заглавной буквой в getter / setter для aNewDate, и это вызывает некоторые проблемы.Не совсем уверен, что происходит, но относится к разделу 8.8 в этом документе: https://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf

...