Вопросы с собеседования 👩💻
Что делает метод strip() в классе String?
Что делает метод strip() в классе String?
Anonymous Quiz
47%
Удаляет пробелы и управляющие символы в начале и конце строки
35%
Удаляет все пробелы
3%
Преобразует строку в верхний регистр
15%
Разделяет строку на части
Jackson
Использование модулей в Jackson: JavaTimeModule и работа с Java 8 датами
Начиная с Java 8, в язык была добавлена новая мощная модель работы со временем: LocalDate, LocalDateTime, Instant и другие типы из пакета java.time. Однако стандартная конфигурация Jackson не умеет корректно сериализовать и десериализовать эти типы "из коробки".
Проблема по умолчанию
Если попытаться сериализовать объект с полем LocalDateTime, Jackson выдаст ошибку или выведет нечитабельное представление (например, через timestamp).
Пример:
Решение: JavaTimeModule
Чтобы Jackson начал понимать java.time.*, нужно подключить модуль JavaTimeModule.
Подключение (если используешь Maven):
Регистрация модуля:
Важно: если хочешь сериализовать даты в человекочитаемом формате, отключи запись timestamp:
Пример работы
Результат:
Аналогично работает и с другими типами:
LocalDate
LocalTime
ZonedDateTime
Instant
Десериализация обратно
Другие полезные модули Jackson
ParameterNamesModule — помогает при десериализации через конструкторы без @JsonProperty
Jdk8Module — поддержка Optional, OptionalInt и других типов из java.util
AfterburnerModule — ускоряет работу Jackson на больших объёмах данных
#Java #Training #Medium #Jackson
Использование модулей в Jackson: JavaTimeModule и работа с Java 8 датами
Начиная с Java 8, в язык была добавлена новая мощная модель работы со временем: LocalDate, LocalDateTime, Instant и другие типы из пакета java.time. Однако стандартная конфигурация Jackson не умеет корректно сериализовать и десериализовать эти типы "из коробки".
Проблема по умолчанию
Если попытаться сериализовать объект с полем LocalDateTime, Jackson выдаст ошибку или выведет нечитабельное представление (например, через timestamp).
Пример:
public class Event {
public String name;
public LocalDateTime dateTime;
public Event() {}
public Event(String name, LocalDateTime dateTime) {
this.name = name;
this.dateTime = dateTime;
}
}
Event event = new Event("Conference", LocalDateTime.now());
String json = objectMapper.writeValueAsString(event);
Без дополнительных модулей Jackson не поймёт, как сериализовать LocalDateTime.
Решение: JavaTimeModule
Чтобы Jackson начал понимать java.time.*, нужно подключить модуль JavaTimeModule.
Подключение (если используешь Maven):
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
Регистрация модуля:
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Важно: если хочешь сериализовать даты в человекочитаемом формате, отключи запись timestamp:
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Пример работы
Event event = new Event("Conference", LocalDateTime.of(2025, 4, 29, 10, 30));
String json = mapper.writeValueAsString(event);
System.out.println(json);
Результат:
{
"name": "Conference",
"dateTime": "2025-04-29T10:30:00"
}
Аналогично работает и с другими типами:
LocalDate
LocalTime
ZonedDateTime
Instant
Десериализация обратно
String input = "{\"name\":\"Conference\",\"dateTime\":\"2025-04-29T10:30:00\"}";
Event event = mapper.readValue(input, Event.class);
Другие полезные модули Jackson
ParameterNamesModule — помогает при десериализации через конструкторы без @JsonProperty
Jdk8Module — поддержка Optional, OptionalInt и других типов из java.util
AfterburnerModule — ускоряет работу Jackson на больших объёмах данных
#Java #Training #Medium #Jackson
Jackson
Частичная сериализация с помощью @JsonView
Иногда возникает задача сериализовать один и тот же объект по-разному — в зависимости от ситуации, роли пользователя, уровня доступа или цели запроса. Например, показывать часть полей для публичного API и все — для администратора.
Jackson решает эту задачу с помощью механизма JSON Views.
Что такое JSON Views
@JsonView — это аннотация, позволяющая управлять, какие поля объекта попадут в JSON в зависимости от выбранного представления (view-класса).
Это как "фильтр по уровням доступа", встроенный прямо в сериализацию.
Шаг 1. Определяем уровни видимости (view)
Шаг 2. Аннотируем поля модели
Теперь:
username виден всем (включая Public)
email и role — только для Internal
Шаг 3. Сериализация с учетом view
Результат:
Если сериализовать с Internal view:
Результат:
Применение в REST (например, Spring)
В Spring можно использовать @JsonView прямо в контроллере:
Когда это нужно
Публичный/приватный API
Разные роли пользователей (гость, клиент, админ)
Безопасность: не передавать чувствительные поля
Удобство: не создавать множество DTO для каждой ситуации
#Java #Training #Medium #Jackson #JsonView
Частичная сериализация с помощью @JsonView
Иногда возникает задача сериализовать один и тот же объект по-разному — в зависимости от ситуации, роли пользователя, уровня доступа или цели запроса. Например, показывать часть полей для публичного API и все — для администратора.
Jackson решает эту задачу с помощью механизма JSON Views.
Что такое JSON Views
@JsonView — это аннотация, позволяющая управлять, какие поля объекта попадут в JSON в зависимости от выбранного представления (view-класса).
Это как "фильтр по уровням доступа", встроенный прямо в сериализацию.
Шаг 1. Определяем уровни видимости (view)
public class Views {
public static class Public {}
public static class Internal extends Public {}
}
Можно создавать любые уровни — главное, чтобы они наследовались при необходимости.
Шаг 2. Аннотируем поля модели
import com.fasterxml.jackson.annotation.JsonView;
public class User {
@JsonView(Views.Public.class)
private String username;
@JsonView(Views.Internal.class)
private String email;
@JsonView(Views.Internal.class)
private String role;
public User() {}
public User(String username, String email, String role) {
this.username = username;
this.email = email;
this.role = role;
}
// Геттеры и сеттеры
}
Теперь:
username виден всем (включая Public)
email и role — только для Internal
Шаг 3. Сериализация с учетом view
ObjectMapper mapper = new ObjectMapper();
User user = new User("alice", "alice@example.com", "ADMIN");
// Публичный вид
String publicJson = mapper
.writerWithView(Views.Public.class)
.writeValueAsString(user);
System.out.println(publicJson);
Результат:
{
"username": "alice"
}
Если сериализовать с Internal view:
String internalJson = mapper
.writerWithView(Views.Internal.class)
.writeValueAsString(user);
Результат:
{
"username": "alice",
"email": "alice@example.com",
"role": "ADMIN"
}
Применение в REST (например, Spring)
В Spring можно использовать @JsonView прямо в контроллере:
@GetMapping("/user/public")
@JsonView(Views.Public.class)
public User getPublicUser() {
return userService.getCurrentUser();
}
@GetMapping("/user/internal")
@JsonView(Views.Internal.class)
public User getInternalUser() {
return userService.getCurrentUser();
}
Когда это нужно
Публичный/приватный API
Разные роли пользователей (гость, клиент, админ)
Безопасность: не передавать чувствительные поля
Удобство: не создавать множество DTO для каждой ситуации
#Java #Training #Medium #Jackson #JsonView
Что выведет код?
#Tasks
public class Task080525 {
public static void main(String[] args) {
int count = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j) continue;
count++;
}
}
System.out.println(count);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое IdentityHashMap?
Что такое IdentityHashMap?
Anonymous Quiz
9%
Отсортированный список
29%
Коллекция уникальных элементов
63%
Коллекция, использующая сравнение ссылок (==) для ключей
0%
Класс для работы с датами
Jackson
Tree Model и Streaming API в Jackson: когда нужна гибкость и производительность
Jackson предлагает не только стандартную POJO-сериализацию, но и более гибкие модели работы с JSON. Среди них — Tree Model и Streaming API.
Tree Model даёт полную свободу при работе с JSON-структурой, а Streaming API — максимальную производительность при чтении/записи больших файлов.
Tree Model (JsonNode): работа с JSON как с деревом
Иногда структура JSON заранее неизвестна или слишком сложна, чтобы описывать её через Java-классы. В таких случаях удобно использовать дерево узлов — JsonNode.
Пример: чтение JSON как дерева
Tree Model позволяет легко:
— обходить структуру вручную
— проверять наличие полей
— работать с вложенностью и массивами
— модифицировать JSON "на лету"
Когда использовать Tree Model
Когда структура JSON может меняться
Когда нужно читать только часть данных
При разработке универсальных парсеров
Когда сложно заранее описать модель через классы
Streaming API (JsonParser/JsonGenerator)
Для огромных JSON-файлов (например, логов, экспорта из БД) загрузка всего файла в память может быть невозможной. Здесь пригодится стриминговый API — он читает JSON по частям, как поток.
Пример: чтение JSON через JsonParser
Когда использовать Streaming API
Работа с большими JSON-файлами, которые нельзя загрузить полностью
Требуется максимальная производительность
Необходимо читать JSON "по частям"
Парсинг в системах с ограниченной памятью (например, embedded)
Сравнение подходов
POJO-модель — просто, типобезопасно, но требует классов
Tree Model — гибко, удобно для анализа/модификации
Streaming API — быстро и экономно, но требует ручного контроля
#Java #Training #Medium #Jackson #Tree_Model #Streaming_API
Tree Model и Streaming API в Jackson: когда нужна гибкость и производительность
Jackson предлагает не только стандартную POJO-сериализацию, но и более гибкие модели работы с JSON. Среди них — Tree Model и Streaming API.
Tree Model даёт полную свободу при работе с JSON-структурой, а Streaming API — максимальную производительность при чтении/записи больших файлов.
Tree Model (JsonNode): работа с JSON как с деревом
Иногда структура JSON заранее неизвестна или слишком сложна, чтобы описывать её через Java-классы. В таких случаях удобно использовать дерево узлов — JsonNode.
Пример: чтение JSON как дерева
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
String json = "{ \"user\": { \"name\": \"Alice\", \"age\": 30 } }";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(json);
String name = rootNode.path("user").path("name").asText();
int age = rootNode.path("user").path("age").asInt();
System.out.println("Имя: " + name + ", Возраст: " + age);
Tree Model позволяет легко:
— обходить структуру вручную
— проверять наличие полей
— работать с вложенностью и массивами
— модифицировать JSON "на лету"
Когда использовать Tree Model
Когда структура JSON может меняться
Когда нужно читать только часть данных
При разработке универсальных парсеров
Когда сложно заранее описать модель через классы
Streaming API (JsonParser/JsonGenerator)
Для огромных JSON-файлов (например, логов, экспорта из БД) загрузка всего файла в память может быть невозможной. Здесь пригодится стриминговый API — он читает JSON по частям, как поток.
Пример: чтение JSON через JsonParser
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(new File("data.json"));
while (!parser.isClosed()) {
JsonToken token = parser.nextToken();
if (JsonToken.FIELD_NAME.equals(token) && "name".equals(parser.getCurrentName())) {
parser.nextToken();
System.out.println("Имя: " + parser.getValueAsString());
}
}
parser.close();
Когда использовать Streaming API
Работа с большими JSON-файлами, которые нельзя загрузить полностью
Требуется максимальная производительность
Необходимо читать JSON "по частям"
Парсинг в системах с ограниченной памятью (например, embedded)
Сравнение подходов
POJO-модель — просто, типобезопасно, но требует классов
Tree Model — гибко, удобно для анализа/модификации
Streaming API — быстро и экономно, но требует ручного контроля
#Java #Training #Medium #Jackson #Tree_Model #Streaming_API
Всем привет 😊
Сегодня не будет обучающих постов или постов с мемами.
В этот день мы, как и все адекватные жители планеты, чтим память миллионов человек отдавших свою жизнь в борьбе с фашистской Германией.
Чтим тех, кто сегодня как и тогда, воюет за свободу и независимость нашей Родины.
На фоне современной геополитической борьбы, попыток принизить и уничтожить память о героизме народов СССР, просто непозволительно игнорировать такой день.
И пусть всегда будут несогласные люди и страны, пусть говорят те, кому личная выгода и безопасность важнее абстрактной Отчизны, но наверно, почти у каждого дома хранятся фотографии дедов с медалями, воспоминания и рассказы о том, как они победили...
С Днем Победы!⭐️
Сегодня не будет обучающих постов или постов с мемами.
В этот день мы, как и все адекватные жители планеты, чтим память миллионов человек отдавших свою жизнь в борьбе с фашистской Германией.
Чтим тех, кто сегодня как и тогда, воюет за свободу и независимость нашей Родины.
На фоне современной геополитической борьбы, попыток принизить и уничтожить память о героизме народов СССР, просто непозволительно игнорировать такой день.
И пусть всегда будут несогласные люди и страны, пусть говорят те, кому личная выгода и безопасность важнее абстрактной Отчизны, но наверно, почти у каждого дома хранятся фотографии дедов с медалями, воспоминания и рассказы о том, как они победили...
С Днем Победы!
Please open Telegram to view this post
VIEW IN TELEGRAM