Java for Beginner
719 subscribers
662 photos
174 videos
12 files
1.03K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download 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
👍2
📌 Факт дня:

А вы знали, что первые компьютерные "спрайты" появились в 1970-х годах?


Спрайты — движущиеся графические объекты в видеоиграх — были впервые реализованы в игровой системе Atari VCS (1970). Они позволили создавать анимации, такие как персонажи в играх, без перерисовки всего экрана.


Proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
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
🔥4
Что выведет код?

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
👍2
Варианты ответа:
Anonymous Quiz
27%
3
42%
6
19%
9
12%
0
👍1
Анонс нового сериала на 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
🔥1
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
👍3
Всем привет 😊

Сегодня не будет обучающих постов или постов с мемами.

В этот день мы, как и все адекватные жители планеты, чтим память миллионов человек отдавших свою жизнь в борьбе с фашистской Германией.

Чтим тех, кто сегодня как и тогда, воюет за свободу и независимость нашей Родины.

На фоне современной геополитической борьбы, попыток принизить и уничтожить память о героизме народов СССР, просто непозволительно игнорировать такой день.

И пусть всегда будут несогласные люди и страны, пусть говорят те, кому личная выгода и безопасность важнее абстрактной Отчизны, но наверно, почти у каждого дома хранятся фотографии дедов с медалями, воспоминания и рассказы о том, как они победили...

С Днем Победы! ⭐️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
🎖 Анатолий Китов — фронтовик, который мечтал соединить страну через компьютеры

В День Победы стоит вспомнить не только тех, кто сражался с оружием в руках, но и тех, кто, пройдя войну, посвятил жизнь будущему — науке и технологиям. Один из таких людей — Анатолий Иванович Китов (1920–2005).

Китов — участник Великой Отечественной, артиллерист, позже — доктор технических наук, генерал-майор, основоположник советской кибернетики и один из первых, кто мечтал о "государственной вычислительной сети" задолго до появления интернета.



🪖 Военная биография

В 1940 году окончил артиллерийское училище.
Прошёл всю войну — от Брянского фронта до Восточной Пруссии.
Был тяжело ранен, но вернулся в строй.
Уже тогда проявлял интерес к вычислениям: составлял таблицы стрельбы, занимался баллистикой.


«Война научила меня одной важной вещи: точность и скорость расчетов — вопрос жизни и смерти».



💻 После войны: путь к вычислительной технике

После демобилизации поступает в Военную артиллерийскую академию им. Дзержинского.
Защищает диссертацию по автоматизации военных расчетов.
В 1950-е — начинает работу с первыми ЭВМ (МЭСМ, БЭСМ).
Предлагает использовать компьютеры не только в военной, но и в народнохозяйственной сфере.


«Если бы все министерства были объединены в одну вычислительную сеть — экономика стала бы прозрачной и эффективной».
(из письма Хрущёву, 1959)


🌐 Первая идея "советского интернета"

В 1959 году Китов отправляет в ЦК КПСС письмо под названием «Красная книга» — манифест о создании национальной автоматизированной системы управления экономикой (АСУ).

Он предлагает:

Централизованную сеть ЭВМ по всей стране;
Автоматизацию планирования и снабжения;
Снижение бюрократии через программирование.


Это предложение опередило ARPANET и идеи интернета на 10 лет, но в СССР кибернетика тогда ещё считалась "буржуазной лженаукой".

«Меня не поняли. Или не захотели понять. Мечта осталась в ящике».


⚙️ Вклад в науку

Один из авторов первого учебника по программированию в СССР.
Участвовал в создании первых языков программирования в СССР (в т.ч. АЛГЭМ).
Продвигал идеи автоматизации в оборонной промышленности.


📘 Наследие

Китов не только изобрёл термины, схемы и алгоритмы. Он пытался изменить мышление эпохи — чтобы компьютеры служили людям, а не только военной машине.
Сегодня, когда мы сидим в IDE и запускаем CI/CD пайплайны, можно вспомнить, что в 1950-е в СССР жил человек, который хотел сделать единую цифровую систему управления всей страной.


https://kitov.rea.ru/polnaa-biografia
🔥9👍1🤮1
🎖 Александр Ляпунов — фронтовик, который научил СССР программировать

В День Победы важно помнить не только тех, кто сражался с оружием в руках, но и тех, кто после войны строил новое мирное будущее — с помощью разума, логики и вычислительной техники. Один из таких людей — Александр Андреевич Ляпунов (1911–2003).

Ляпунов - это:
Математик, логик, кибернетик.
Один из основоположников теории алгоритмов и программирования в СССР.
Ветеран Великой Отечественной войны.
Один из авторов первого отечественного языка программирования («Альфа»).
Участвовал в создании первой советской ЭВМ — БЭСМ.


🪖 Военные годы


В начале войны — сотрудник Академии наук СССР.
Служил в рядах Красной Армии, занимался военными расчётами и криптоанализом.
После войны продолжил научную работу в сфере автоматизации и математики.


🧮 После войны — математика, логика, ЭВМ

Работал в Институте точной механики и вычислительной техники АН СССР.
Один из первых, кто преподавал программирование в СССР.
В 1954 году стал соавтором учебника «Основы программирования» — первого в стране.
Создавал языки программирования и системы автоматического перевода с математического языка на машинный код.

«Язык программирования — это мост между идеей и железом».


💻 Язык «Альфа» — шаг в сторону системного программирования

Совместно с Андреем Ершовым и Сергеем Масловым, Ляпунов разработал в конце 1950-х язык "Альфа" — предшественник более развитых систем программирования.
Основан на математической логике и языках типа АЛГОЛ.
Предназначался для научных расчётов.
Был использован на первых отечественных ЭВМ (в т.ч. БЭСМ-2).


🔬 Исследователь искусственного интеллекта

С 1960-х годов Ляпунов активно интересовался темами:
Машинного перевода;
Искусственного интеллекта;
Теории автоматов.
Он был одним из тех, кто помогал вносить термин «кибернетика» в научный обиход СССР, когда её ещё воспринимали с подозрением.


📘 Учитель поколений

Занимался научной педагогикой;
Подготовил целую плеяду учёных-программистов;
Один из основателей советской школы автоматического программирования.


https://www.computer-museum.ru/galglory/lypunov2.htm
википедия
👍81🤮1