Форматирование поля LocalDate в JSON с Jackson в Java 8

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для форматирования полей типа LocalDate используйте аннотацию @JsonFormat с указанием нужного формата. Осуществите подключение модуля JavaTimeModule для корректной работы с датами Java 8.

Java
Скопировать код
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate date;

В классе ObjectMapper произведите регистрацию модуля JavaTimeModule и отключите функцию timestamps:

Java
Скопировать код
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Кинга Идем в IT: пошаговый план для смены профессии

Обойдите проблемы, связанные с часовыми поясами

Часовые пояса могут вызывать много трудностей. По умолчанию Jackson использует часовой пояс UTC. Примените DateTimeFormatter, привязанный к UTC и спите спокойно.

Java
Скопировать код
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "UTC")
private LocalDate date;

Пользовательские форматы: разрушаем шаблоны

Если стандарт ISO не подходит вам, то специализированный сериализатор и десериализатор позволят вам получить свободу в представлении дат:

Java
Скопировать код
// Пользовательский сериализатор
public class CustomLocalDateSerializer extends StdSerializer<LocalDate> {
    private static final DateTimeFormatter MY_FANCY_FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy");

    public CustomLocalDateSerializer() {
        super(LocalDate.class);
    }

    @Override
    public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider sp) throws IOException {
        gen.writeString(value.format(MY_FANCY_FORMATTER));
    }
}

// Пользовательский десериализатор
public class CustomLocalDateDeserializer extends StdDeserializer<LocalDate> {
    private static final DateTimeFormatter MY_FANCY_FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy");

    public CustomLocalDateDeserializer() {
        super(LocalDate.class);
    }

    @Override
    public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDate.parse(p.getText(), MY_FANCY_FORMATTER);
    }
}

@JsonSerialize(using = CustomLocalDateSerializer.class)
@JsonDeserialize(using = CustomLocalDateDeserializer.class)
private LocalDate date;

Решение распространённых проблем

Стаолкнулись с проблемами? Проверьте совместимость вашей библиотеки. Убедитесь, что версии jackson-databind и jackson-datatype-jsr310 функционируют безупречно. В проектах на Spring Boot вам поможет система управления зависимостями.

При возникновении проблем включите TRACE логирование для com.fasterxml.jackson или обратитесь к аннотациям JAXB для дополнительной информации.

Визуализация

Представьте LocalDate в виде календарных дат (📅), каждая из которых отражает определённый день.

📅: ["2023-04-05", "2023-04-06", ...]

Теперь визуализируйте, что Jackson это художник 🎨, который переформатирует эти даты.

Без JacksonС Jackson (собственный формат)
📅: ["2023-04-05"]🎨📅: ["05-04-2023"]

Jackson "причёсывает" наши даты, делая их легче воспринимаемыми и более понятными.

Подробнее о конфигурации

Будьте готовы к тому, что возможны неожиданные трудности. Вот некоторые из них:

  • Сериализация пустых значений: Jackson может обрабатывать их по-разному, в зависимости от настроек.
  • Массивы и коллекции: При сериализации LocalDate в таких структурах не забудьте использовать JavaTimeModule.
  • Разные локали: Переход к различным локализациям может потребовать от вас использования разных настроек и форматтеров.

Совместная работа со старыми системами

Если вы работаете со старыми системами, учтите следующее:

  • Обработка старых типов дат: Настройте взаимодействие между LocalDate и старым Date с использованием Jackson.
  • Нестандартные форматы: Если ваш формат даты нестандартный, используйте DateTimeFormatter вместе с @JsonFormat.
  • Смешивание форматов дат: При смешивании различных форматов дат в JSON убедитесь, что для каждого типа установлена своя аннотация или настройте свой сериализатор и десериализатор.

Полезные материалы

  1. Дата в Jackson | Baeldung — Подробная инструкция по сериализации дат в Java с использованием Jackson.
  2. Просто момент... — Обсуждения на Stack Overflow касательно LocalDate и Jackson в Java 8.
  3. DZone — Секреты и лучшие методы настройки сериализации дат в Java 8 с Jackson.
  4. Аннотации Jackson · FasterXML/jackson-annotations Wiki · GitHub — Официальная документация по аннотациям Jackson.
  5. Spring Boot и JSON: Сериализация и десериализация с помощью Jackson – Не найдено название — подробное руководство по сериализации и десериализации JSON в среде Spring Boot.