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
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Channel photo updated
Всем субботний, солнечный привет! ✌️

Целую неделю я думал над итогами опроса о канале.

На основные вопросы - почему новые подписчики приходят и потом уходят, почему имеющиеся поставили канал на заглушку и не читают его - напрашиваются вполне очевидные выводы:

- Не смотря на то, что канал называется Java для новичков, рассматриваемые темы давно ушли за мидловский предел.
- Нет внятного оглавления для поиска интересующей информации для разных грейдов.
- Объемные и подробные посты, неудобно читать к примеру с телефона.
- Сухость и формализм обучающих постов, полезны, но не интересны для новичков.
- Количество ежедневных постов, большинство скорее отталкивает, чем привлекает.

Основываясь на этих проблемах, с которыми Вы возможно согласны, я решил:

- Пересмотреть объем и частоту обучающих постов. Теперь когда в нашем оглавлении, есть практически весь Java Core, можно сконцентрироваться на изучении более точечных и новых технологий новых версий Java, библиотек и фреймворков.
- Ежедневно возвращаться и более обстоятельно рассматривать темы для новичков, но в более популярном формате.
- Полностью переработать оглавление, чтобы человеку любого грейда было легко найти интересующую тему, которая рассматривалась в канале.
- Добавить немного авторского мнения и разбора некоторых моментов в разработке.
- Дать возможность новичкам выбирать темы для разбора - путем выбора и голосования.


Что скажете на такие предложения? 🤓
Please open Telegram to view this post
VIEW IN TELEGRAM