fbpx

Blog

5 Фишек работы с GSON о которых вы не знали.

Многие работали с такой библиотекой для сериализации (проще говоря парсинга) данных как GSON. Однако не все знают насколько гибким и мощным может быть этот инструмент при работе с парсингом  json-ответа от сервера. В этой статье расскажу о 5 крутых возможностях  GSON.

Для начала, вспомним, что такое GSON. GSON – это библиотека Java с открытым исходным кодом для сериализации и десериализации объектов Java в JSON. Рассмотрим простой пример, который демонстрирует превращение объекта в JSON и наоборот.

Gson gson = new Gson();
String sample = gson.toJson(Movie.createSample());
Movie fromJsonMovie = gson.fromJson(sample, Movie.class);

Это классическое использование GSON, а теперь, давайте рассмотрим фишки, о которых мало кто знает.

1. Альтернативное название полей при парсинге JSON.

Для превращения полей ответа от сервера в виде JSON в поля объекта используется аннотация @Serialiazed. Для её использования необходимо передать название поле, которое будет соответствовать полю объекта. Например:

public class Movie {
    String title;
    Integer year;
    String imageUrl;
    String genre;
    <strong>@SerializedName("country")</strong>
    String movieCountry;

    public Movie(String title, Integer year, String imageUrl, String genre, String movieCountry) {
        this.title = title;
        this.year = year;
        this.imageUrl = imageUrl;
        this.genre = genre;
        this.movieCountry = movieCountry;
    }
}

В данном случае, поле с названием “country” будет записано в поле класса Movie как movieCountry. Но, что если спецификации названия поля может поменяться, или вы не уверены в названии поля, так как API еще не готово? Можно ли задать альтернативные названия для поля? Ответ – да. Библиотека GSON позволяет задать альтернативные названия. Вы можете указать возможные названия через разделитель (запятую) с помощью ключевого слова alternate. Например так:

public class Movie {
    String title;
    Integer year;
    String imageUrl;
    String genre;
   <strong> @SerializedName(value = "country", alternate = "Country")</strong>
    String movieCountry;
}

Таким образом, любое поле, будь то “country” или “Country” будет правильно разобрано и записано в поле movieCountry класса Movie

2. Автоматическое изменение названия полей с помощью метода setFieldNamingPolicy()

Если вам нужно применить к полю определенную политику именования полей – то в этом вам поможет метод setFieldNamingPolicy(). Например, нам нужно поле переименовать в LowerCase и добавлять тире между словами. Это можно сделать достаточно просто, используя рассмотренный метод:

GsonBuilder gsonBuilder = new GsonBuilder();
// Применяем политику именования
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.<em>LOWER_CASE_WITH_DASHES</em>);
Gson gson = gsonBuilder.create();
Movie movie = new Movie("Spider-man", null, null, "Action", "USA");
String movieJson = gson.toJson(movie);

Теперь, если мы выведем на печать и посмотрим, что получилось – то заметим, что название поля movieCountry при превращении в JSON стало movie-country. Всего таких политик 6, вы можете использовать любую из них.

  • IDENTITY()
  • UPPER_CAMEL_CASE()
  • UPPER_CAMEL_CASE_WITH_SPACES()
  • LOWER_CASE_WITH_UNDERSCORES()
  • LOWER_CASE_WITH_DASHES()
  • LOWER_CASE_WITH_DOTS()

Но если ни одна из них не подойдет – то можете написать свою, используя интерфейс FieldNamingStrategy и переопределив метод translateName() и передать реализацию этого интерфейса в метод setFieldNamingStrategy()

Используя этот интерфейс и передав его реализацию в метод setFieldNamingStrategy() вы можете определить любую политику именования

3. Игнорирование того или иного поля при сериализации или десериализации в зависимости от указанной версии.

Вы можете изменить логику парсинга в зависимости от указанной в GSON версии. Например, вы не хотите чтобы при сериализации или десериализации JSON то или иное поле парсилось. Вы можете это сделать используя метод setVersion(). Если посмотреть на документацию этого метода, то станет ясно, что в аргумент нужно указывать версию выше которой данное поле будет игнорироваться.

Рассмотрим пример. Есть модель Student

Как мы видим, c помощью аннотации @Since можно указать ту или иную версию.

Результатом будет строка {“id”:1,”name”:”John Snow”} Поле verified не будет разобрано, так как все поля аннотированные версией выше 1.0 будут игнорироваться при серилизации или десериализации ответа.

4. Форматированный JSON ответ в консоли.

Согласитесь, читать огромный JSON в одну строку очень сложно. Гораздо приятней читать форматированный ответ от сервера. В этом вам поможет метод setPrettyPrinting(). Для его использования достаточно добавить вызов этого метода в GsonBuilder()

GsonBuilder gsonBuilder = new GsonBuilder();
// Обратите внимание
gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();

Теперь ответ от сервера будет читабелен и понятен.

5. Сериализация пустых полей.

Иногда, необходимо, чтобы поля, значение которых является null, тоже отображались в JSON. Это можно сделать, используя метод serializeNulls()

GsonBuilder gsonBuilder = new GsonBuilder();
// Обратите внимание
gsonBuilder.serializeNulls()
Gson gson = gsonBuilder.create();

Теперь, даже те поля экземпляра объекта, которые null – при сериализации в JSON будут иметь значение null, например {“title”:”Spider-man”,”year”:null,”imageUrl”:null,”genre”:”Action”,”country”:”USA”}

Понравилась статья? Подписывайся на telegram-канал и группу Вконтакте для получения самых интересных материалов по Android – разработке.