Библиотека Java Gson
Gson — это библиотека Java, предоставленная Google для преобразования объектов Java в представление JSON (сериализация) и преобразования строк JSON в объекты Java (десериализация).
Основные возможности Gson включают:
- Простой и удобный API
- Не требуются аннотации в классах Java (но аннотации поддерживаются)
- Высокая производительность
- Поддержка обобщений
- Поддержка пользовательской сериализации и десериализации
Основные классы:
Gson: Основной класс, предоставляет методы сериализации и десериализацииJsonElement: Абстрактный класс для элементов JSONJsonObject: Представление объекта JSONJsonArray: Представление массива JSON
Почему стоит использовать Gson?
В разработке на Java нам часто приходится обрабатывать данные JSON в следующих сценариях:
- Взаимодействие с RESTful API
- Чтение и запись файлов конфигурации
- Сохранение данных
- Обмен данными между разными системами
Gson предоставляет простой и эффективный способ решения этих задач и удобнее, чем встроенная в Java обработка JSON.
Базовое использование Gson
Добавление зависимости Gson
Сначала нужно добавить зависимость Gson в ваш проект. Если вы используете Maven, её можно добавить в pom.xml:
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
Простой пример преобразования между объектами Java и JSON:
Пример
public class GsonDemo {
public static void main(String[] args) {
Gson gson = new Gson();
// Преобразование объекта Java в JSON
Person person = new Person("Zhang San", 30);
String json = gson.toJson(person);
System.out.println(json); // Вывод: {"name":"Zhang San","age":30}
// Преобразование JSON в объект Java
Person parsedPerson = gson.fromJson(json, Person.class);
System.out.println(parsedPerson.getName()); // Вывод: Zhang San
}
}
class Person {
private String name;
private int age;
// Конструктор
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Методы-геттеры (Gson требует геттеры/сеттеры)
public String getName() { return name; }
public int getAge() { return age; }
}
Создайте экземпляр Gson
Преобразование объекта Java в JSON (сериализация)
Пример
private String name;
private int age;
// Конструктор, геттеры и сеттеры опущены
}
User user = new User("Zhang San", 25);
String json = gson.toJson(user);
// Вывод: {"name":"Zhang San","age":25}
Преобразование JSON в объект Java (десериализация)
Пример
User user = gson.fromJson(json, User.class);
System.out.println(user.getName()); // Вывод: Li Si
Общие возможности
Обработка коллекций
Пример
List<Person> people = Arrays.asList(
new Person("Wang Wu", 28),
new Person("Zhao Liu", 32)
);
String jsonList = gson.toJson(people);
// Десериализация коллекции
Type listType = new TypeToken<List<Person>>(){}.getType();
List<Person> parsedPeople = gson.fromJson(jsonList, listType);
Обработка дат
Пример
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
Date now = new Date();
String dateJson = gson.toJson(now);
Date parsedDate = gson.fromJson(dateJson, Date.класс);
Обработка древовидной модели
Пример
JsonElement element = JsonParser.parseString(json);
JsonObject object = element.getAsJsonObject();
String name = object.get("name").getAsString();
int age = object.get("age").getAsInt();
Общие конфигурации
Форматированный вывод
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
Обработка значений null
Gson gson = new GsonBuilder()
.serializeNulls() // 序列化null值
.create();
Стратегия именования полей
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
// 会将userName转换为user_name
Расширенные возможности Gson
Обработка сложных объектов
Gson может обрабатывать сложные структуры данных, содержащие вложенные объекты, массивы, коллекции и т. д.:
Пример
private String orderId;
private List<Product> products;
// Остальной код опущен
}
Order order = new Order("123", Arrays.asList(
new Product("Мобильный телефон", 1, 2999.00),
new Product("Наушники", 2, 199.00)
));
String json = gson.toJson(order);
Использование TypeToken для обработки обобщённых типов
Когда вам нужно обрабатывать обобщённые коллекции, вы можете использовать TypeToken:
Пример
Type productListType = new TypeToken<List<Product>>(){}.getType();
List<Product> products = gson.fromJson(json, productListType);
Пользовательская сериализация и десериализация
Вы можете настроить логику обработки, реализовав интерфейсы JsonSerializer и JsonDeserializer:
Пример
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Override
public JsonElement serialize(Date date, Type type, JsonSerializationContext context) {
return new JsonPrimitive(format.format(date));
}
}
// Использовать пользовательский сериализатор
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateSerializer())
.create();
Использование аннотаций
Gson предоставляет несколько полезных аннотаций:
Пример
@SerializedName("user_name") // Имя поля JSON
private String name;
@Expose(serialize = false) // Не сериализуется
private String password;
@Since(1.0) // Контроль версий
private String email;
}
Конфигурация GsonBuilder
GsonBuilder предоставляет различные параметры конфигурации:
Пример
.setPrettyPrinting() // Форматированный вывод
.serializeNulls() // Сериализация null-значений
.setDateFormat("yyyy-MM-dd") // Формат даты
.disableHtmlEscaping() // Отключить HTML-экранирование
.create();
Вопросы производительности
- Повторно используйте экземпляры Gson: Gson потокобезопасен, поэтому рекомендуется переиспользовать, а не создавать их часто
- При больших объёмах данных рассмотрите использование потокового API (JsonReader/JsonWriter)
- Сложные структуры объектов могут влиять на производительность
Сравнение Gson с другими JSON-библиотеками
| Характеристика | Gson | Jackson | org.json |
|---|---|---|---|
| Простота использования | Высокая | Средняя | Высокая |
| Производительность | Средняя | Высокая | Низкая |
| Функциональная полнота | Высокая | Очень высокий | Низкая |
| Поддержка сообщества | Высокая | Очень высокий | Средняя |
Итог
Gson — мощная и при этом простая библиотека обработки JSON, подходящая для большинства проектов на Java. Она предоставляет:
- Простой дизайн API
- Гибкие параметры конфигурации
- Хорошая производительность
- Богатый функционал
Для простых задач обработки JSON Gson часто является первым выбором Java-разработчиков. Для требований к высокой производительности или сложных сценариев вы можете рассмотретьJacksonи другие библиотеки.
Другие расширения
Общие библиотеки Java