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