Java for Beginner
672 subscribers
541 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
ИИ сделало бы все быстрее ☝️

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Jackson

Частичная сериализация с помощью @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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
27%
3
42%
6
19%
9
12%
0
Анонс нового сериала на Netflix ✌️😂

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
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 как дерева
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