Что такое аннотации полей в библиотеке Gson?

«Что такое аннотации полей в библиотеке Gson?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В библиотеке Gson (Google's JSON library для Java) аннотации полей используются для тонкого управления процессом сериализации (преобразование объекта в JSON) и десериализации (преобразование JSON в объект). Они позволяют переопределить стандартное поведение Gson.

Основные аннотации:

  1. @SerializedName — Указывает имя поля в JSON, если оно отличается от имени поля в Java-классе.

    public class User {
        @SerializedName("full_name") // В JSON будет ключ "full_name"
        private String name;
        private String email;
    }
    // Сериализуется в: {"full_name":"John","email":"john@example.com"}
  2. @Expose — Пометка поля для явного включения или исключения из процессов сериализации/десериализации. Работает только в паре с GsonBuilder().excludeFieldsWithoutExposeAnnotation().

    public class User {
        @Expose // Будет включено и в сериализацию, и в десериализацию
        private String name;
    
        @Expose(serialize = false) // Будет проигнорировано при сериализации (в JSON не попадет)
        private String passwordHash;
    
        private String internalToken; // Без @Expose - будет проигнорировано при использовании excludeFieldsWithoutExposeAnnotation()
    }
    
    Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation() // Критически важно!
        .create();

Почему это важно: Аннотации дают контроль над форматом JSON (совместимость с внешними API) и безопасностью (исключение конфиденциальных полей, таких как пароли или токены, из выходного JSON). Без @Expose и соответствующего GsonBuilder все не-transient и не-static поля сериализуются по умолчанию.