На этом шаге мы рассмотрим применение функций toJson и fromJson для более сложных типов объектов
На прошлом шаге мы рассмотрели как с помощью библиотеки Gson производить сериализацию и десериализацию простейших типов. На этом шаге мы рассмотрим, как это сделать для произвольных объектов.
Рассмотрим первый пример. Пусть у нас есть массив чисел. Сериализация и десериализация таких объектов ничем не отличается от тех же операций для простейших типов:
Gson gson = new Gson(); System.out.println(gson.toJson(new int[] {1, 2, 3, 4, 5})); int[] array = gson.fromJson("[6,7,8,9,0]", int[].class); for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } System.out.println(); // На экране // [1,2,3,4,5] // 6 7 8 9 0
Рассмотрим второй пример. Пусть у нас уже есть собственный класс TestGson.
class TestGson { @SerializedName("test_number") private int number; @SerializedName("test_string") private String string; private transient boolean boolValue; public TestGson(int number, String string, boolean boolValue) { this.number = number; this.string = string; this.boolValue = boolValue; } @Override public String toString() { return "number = " + number + ", string = " + string + ", boolValue = " + boolValue; } }
В таком случае сериализация и десериализация также не будет отличаться от тех же операций для простейших типов:
Gson gson = new Gson(); TestGson testGson = new TestGson(1, "ddd", true); String json = gson.toJson(testGson); System.out.println(json); System.out.println(gson.fromJson(json, TestGson.class)); // на экране // {"test_number":1,"test_string":"ddd"} // number = 1, string = ddd, boolValue = false
Обратим внимание на ключевое слово transient. По умолчанию поля, помеченные таким словом, не будут сериализовываться. Таким образом, после десериализации такие поля будут проинициализированы значениями по умолчанию.
Имя ключа в json объекте по умолчанию будет совпадать с именем поля. Если вы хотите переопределить имя ключа, то нужно воспользоваться аннотацией @SerializedName, передав ей новое имя ключа.
Рассмотрим третий пример. Пусть у нас есть список объектов. Сериализация списков ничем не отличается от сериализации простейших типов.
Gson gson = new Gson(); List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 5; i++) { list.add(i + 1); } System.out.println(gson.toJson(list));
А вот для десериализации списков нужно проделать следующее:
Type type = new TypeToken<List<Integer>>() {}.getType();
list = gson.fromJson("[6,7,8,9,0]", type);
Мы создали объект типа Type, как это показано выше. После чего мы передали созданный объект вторым аргументом в функцию fromJson в качестве типа результата.
На следующем шаге мы закончим рассматривать функции toJson и fromJson