Библиотека Java Gson

Java 常用类库Общие библиотеки Java


Gson — это библиотека Java, предоставленная Google для преобразования объектов Java в представление JSON (сериализация) и преобразования строк JSON в объекты Java (десериализация).

Основные возможности Gson включают:

  • Простой и удобный API
  • Не требуются аннотации в классах Java (но аннотации поддерживаются)
  • Высокая производительность
  • Поддержка обобщений
  • Поддержка пользовательской сериализации и десериализации

Основные классы:

  • Gson: Основной класс, предоставляет методы сериализации и десериализации

  • JsonElement: Абстрактный класс для элементов JSON

  • JsonObject: Представление объекта JSON
  • JsonArray: Представление массива JSON


Почему стоит использовать Gson?

В разработке на Java нам часто приходится обрабатывать данные JSON в следующих сценариях:

  • Взаимодействие с RESTful API
  • Чтение и запись файлов конфигурации
  • Сохранение данных
  • Обмен данными между разными системами

Gson предоставляет простой и эффективный способ решения этих задач и удобнее, чем встроенная в Java обработка JSON.


Базовое использование Gson

Добавление зависимости Gson

Сначала нужно добавить зависимость Gson в ваш проект. Если вы используете Maven, её можно добавить в pom.xml:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

Простой пример преобразования между объектами Java и JSON:

Пример

import com.google.gson.Gson;

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

Gson gson = new Gson();

Преобразование объекта Java в JSON (сериализация)

Пример

class User {
    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 (десериализация)

Пример

String json = "{\"name\":\"Li Si\",\"age\":30}";
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);

Обработка дат

Пример

Gson gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd HH:mm:ss")
    .create();

Date now = new Date();
String dateJson = gson.toJson(now);
Date parsedDate = gson.fromJson(dateJson, Date.класс);

Обработка древовидной модели

Пример

String json = "{\"name\":\"Li Si\",\"age\":25}";
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 может обрабатывать сложные структуры данных, содержащие вложенные объекты, массивы, коллекции и т. д.:

Пример

class Order {
    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:

Пример

String json = "[{\"name\":\"Apple\",\"price\":5.5},{\"name\":\"Banana\",\"price\":3.2}]";

Type productListType = new TypeToken<List<Product>>(){}.getType();
List<Product> products = gson.fromJson(json, productListType);

Пользовательская сериализация и десериализация

Вы можете настроить логику обработки, реализовав интерфейсы JsonSerializer и JsonDeserializer:

Пример

public class DateSerializer implements JsonSerializer<Date> {
    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 предоставляет несколько полезных аннотаций:

Пример

class User {
    @SerializedName("user_name")  // Имя поля JSON
    private String name;
   
    @Expose(serialize = false)   // Не сериализуется
    private String password;
   
    @Since(1.0)                  // Контроль версий
    private String email;
}

Конфигурация GsonBuilder

GsonBuilder предоставляет различные параметры конфигурации:

Пример

Gson gson = new 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 常用类库Общие библиотеки Java

Другие расширения