Базовая десериализация и аннотации в Gson
Десериализация JSON в Java-объект
Метод fromJson(String, Class<T>)
Десериализация — процесс преобразования JSON-строки в Java-объект. Основной метод:
Пример
Допустим, есть JSON:
Соответствующий Java-класс:
Десериализация:
Обработка ошибок
Gson выбрасывает JsonSyntaxException при невалидном JSON:
Аннотации @SerializedName и @Expose
@SerializedName — для нестандартных ключей JSON
Если имя поля в Java не совпадает с ключом в JSON:
Пример JSON:
@Expose — избирательная сериализация/десериализация
Поля без @Expose игнорируются. Требуется особый Gson:
Пример класса:
Отличие от Jackson
Аннотации:
В Gson: @SerializedName → @JsonProperty в Jackson.
@Expose → Аналог @JsonInclude + @JsonIgnore.
Подход:
Gson использует рефлексию по умолчанию, Jackson — аннотации.
Производительность:
Jackson быстрее в некоторых сценариях, но Gson проще в настройке.
Полный пример
Вывод:
Ключевые моменты
@SerializedName решает проблему различий в именах JSON/Java.
@Expose дает контроль над процессами сериализации/десериализации.
Для работы @Expose требуется GsonBuilder.
#Java #middle #Gson #SerializedName #Expose
Десериализация 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