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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Базовая десериализация и аннотации в Gson

Десериализация JSON в Java-объект


Метод fromJson(String, Class<T>)
Десериализация — процесс преобразования JSON-строки в Java-объект. Основной метод:

Gson gson = new Gson();
MyClass obj = gson.fromJson(jsonString, MyClass.class);


Пример
Допустим, есть JSON:
{
"model": "Tesla Model S",
"year": 2023,
"electric": true
}


Соответствующий Java-класс:
public class Car {
private String model;
private int year;
private boolean electric;

// Обязателен конструктор по умолчанию (или @SerializedConstructor в новых версиях)
public Car() {}

// Геттеры и сеттеры
public String getModel() { return model; }
public int getYear() { return year; }
public boolean isElectric() { return electric; }
}


Десериализация:
String json = "{\"model\":\"Tesla Model S\",\"year\":2023,\"electric\":true}";
Gson gson = new Gson();
Car car = gson.fromJson(json, Car.class);

System.out.println(car.getModel()); // Tesla Model S


Обработка ошибок

Gson выбрасывает JsonSyntaxException при невалидном JSON:
try {
Car car = gson.fromJson("{invalid json}", Car.class);
} catch (JsonSyntaxException e) {
System.err.println("Ошибка парсинга JSON: " + e.getMessage());
}


Аннотации @SerializedName и @Expose

@SerializedName — для нестандартных ключей JSON

Если имя поля в Java не совпадает с ключом в JSON:
public class User {
@SerializedName("user_name")
private String name; // Сопоставляется с JSON-ключом "user_name"

@SerializedName(value = "user_age", alternate = {"age", "years"})
private int age; // Допустимые альтернативные ключи в JSON
}


Пример JSON:
{"user_name": "Alice", "age": 25}


@Expose — избирательная сериализация/десериализация

Поля без @Expose игнорируются. Требуется особый Gson:
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();


Пример класса:
public class Product {
@Expose
private String name; // Сериализуется и десериализуется

@Expose(serialize = false)
private int id; // Только десериализация (из JSON в Java)

private String secret; // Игнорируется полностью
}


Отличие от Jackson

Аннотации:

В Gson: @SerializedName@JsonProperty в Jackson.
@Expose → Аналог @JsonInclude + @JsonIgnore.

Подход:
Gson использует рефлексию по умолчанию, Jackson — аннотации.

Производительность:
Jackson быстрее в некоторых сценариях, но Gson проще в настройке.

Полный пример

import com.google.gson.*;
import com.google.gson.annotations.*;

public class Main {
static class Device {
@SerializedName("device_name")
@Expose
private String name;

@Expose(deserialize = false)
private String manufacturer;

public Device(String name, String manufacturer) {
this.name = name;
this.manufacturer = manufacturer;
}
}

public static void main(String[] args) {
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.setPrettyPrinting()
.create();

// Сериализация (manufacturer исключен, т.к. deserialize = false)
Device device = new Device("Phone", "BrandX");
String json = gson.toJson(device);
System.out.println(json);

// Десериализация
String inputJson = "{\"device_name\":\"Tablet\",\"manufacturer\":\"BrandY\"}";
Device parsed = gson.fromJson(inputJson, Device.class);
System.out.println(parsed.name); // "Tablet"
}
}


Вывод:
{
"device_name": "Phone"
}


Ключевые моменты

@SerializedName решает проблему различий в именах JSON/Java.
@Expose дает контроль над процессами сериализации/десериализации.
Для работы
@Expose требуется GsonBuilder.

#Java #middle #Gson #SerializedName #Expose