Джексон Java 8 LocalDateTime сериализация с нанотехнологиями - PullRequest
0 голосов
/ 27 ноября 2018

В настоящее время я пытаюсь перенести форму проекта joda time в java8 time api.

После замены компонентов joda компонентами java8 возникают проблемы с сериализацией.Конечно, я добавил зависимости и зарегистрировал новый модуль JavaTimeModule().Но когда я пытаюсь сериализовать

LocalDateTime.of(1988, 11, 10, 7, 31, 32, 0)

, я получаю массив [1988,11,10,7,31,32], но ожидается [1988,11,10,7,31,32,**0**] (с нанослоями).

Итак, вопрос в следующем: возможно ли сериализовать время с нанослоями, даже если оно равно 0 ?

1 Ответ

0 голосов
/ 05 февраля 2019

После просмотра кода Джексона LocalDateTimeSerializer секунды и наночастицы явно игнорируются, когда их значения равны 0

private final void _serializeAsArrayContents(LocalDateTime value, JsonGenerator g, SerializerProvider provider) throws IOException {
    g.writeNumber(value.getYear());
    g.writeNumber(value.getMonthValue());
    g.writeNumber(value.getDayOfMonth());
    g.writeNumber(value.getHour());
    g.writeNumber(value.getMinute());
    int secs = value.getSecond();
    int nanos = value.getNano();
    if (secs > 0 || nanos > 0) {
        g.writeNumber(secs);
        if (nanos > 0) {
            if (this.useNanoseconds(provider)) {
                g.writeNumber(nanos);
            } else {
                g.writeNumber(value.get(ChronoField.MILLI_OF_SECOND));
            }
        }
    }
}

Для достижения желаемого результата необходимо создатьпользовательский сериализатор и зарегистрировать его модуль после JavaTimeModule

public class LocalDateTimeWithNanoSerializer extends StdSerializer<LocalDateTime> {

    public LocalDateTimeWithNanoSerializer() {
        super(LocalDateTime.class);
    }

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartArray();
        gen.writeNumber(value.getYear());
        gen.writeNumber(value.getMonthValue());
        gen.writeNumber(value.getDayOfMonth());
        gen.writeNumber(value.getHour());
        gen.writeNumber(value.getMinute());
        gen.writeNumber(value.getSecond());
        gen.writeNumber(value.getNano());
        gen.writeEndArray();
    }
}
public class Application {
    public static void main(String[] args) {
        SimpleModule myModule = new SimpleModule();
        myModule.addSerializer(new LocalDateTimeWithNanoSerializer());
        ObjectMapper objectMapper = new ObjectMapper()
              .registerModule(new JavaTimeModule())
              .registerModule(myModule)
    }
}
...