Вступление
Эта статья дополняет предыдущую статью « Начало работы с Google GSON», где представлены вводные материалы по использованию Google Gson.
В этой статье показаны некоторые дополнительные возможности библиотеки GSON. Поскольку есть много вещей, которые нужно написать об этих дополнительных вкусностях, поэтому я разделил длинную статью на 2 серии статей. Итак, в этой части первой и в следующей статье я буду публиковать оставшиеся статьи.
Прелесть использования библиотеки GSON заключается в том, что она не требует каких-либо аннотаций или конфигураций для простых преобразований. Хотя он использует конфигурации по умолчанию для простоты. GSON обладает гибкостью при создании Json из Java-объекта и наоборот. Наш действительно класс Gson содержит много значений по умолчанию для преобразования json, но мы можем переопределить значения по умолчанию с помощью класса GsonBuilder . Итак, начнем.
Довольно форматированный вывод JSON
Когда вы печатаете выходную строку json, созданную с помощью Gson, вы увидите вывод в одну строку, что-то вроде следующего
|
1
|
{"name":"ajduke","languagesKnown":["Java","Scala","JavaScript"]} |
Это режим форматирования по умолчанию, называемый компактным режимом. Труднее читать, когда у вашего json много полей и компонентов. Для правильного форматирования, библиотека имеет приятный симпатичный режим форматирования, который печатает каждое поле в одну строку
Чтобы использовать это, вам нужно создать экземпляр Gson с помощью GsonBuilder # setPrettyPrinting (), как показано в следующем листинге
Ниже приведен наш класс, объект которого преобразуется в его представление json,
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
class Developer { private String name; private String classz; List<String> languagesKnown; public Developer() { name = "ajduke"; languagesKnown = new ArrayList<>(); languagesKnown.add("Java"); languagesKnown.add("Scala"); languagesKnown.add("Ruby"); }} |
Примечание строка № 7 для использования,
|
01
02
03
04
05
06
07
08
09
10
|
Gson gson = new Gson();String json = gson.toJson(new Developer());System.out.println("********* Compact mode ***********");System.out.println(json); GsonBuilder gsonBuilder = new GsonBuilder();Gson prettyGson = gsonBuilder.setPrettyPrinting().create();json = prettyGson.toJson(new Developer());System.out.println("\n ******* Pretty formatting *********");System.out.println(json); |
и выход для выше
|
01
02
03
04
05
06
07
08
09
10
11
12
|
********* Compact mode ***********{"name":"ajduke","languagesKnown":["Java","Scala","Ruby"]} ******* Pretty formatting *********{ "name": "ajduke", "languagesKnown": [ "Java", "Scala", "Ruby" ]} |
Включение пустых полей в вывод JSON
По умолчанию при преобразовании поля нулевых значений игнорируются при преобразовании в формат Json. Это просто, чтобы сделать вывод четким и компактным.
Но мы можем переопределить это поведение, создав экземпляр Gson с помощью GsonBuilder #serializeNulls () . Следующий список показывает
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
class Developer { private String name; private String classz; List<String> languagesKnown; public Developer() { name = "ajduke"; classz= "Developer"; languagesKnown = new ArrayList<>(); languagesKnown.add("Java"); languagesKnown.add("Scala"); languagesKnown.add("Ruby"); }} |
Примечание строка №11 для использования,
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
Gson gson = new Gson();System.out.println("Default behaviour ");GsonBuilder gsonBuilder = new GsonBuilder();Gson prettyGson = gsonBuilder.setPrettyPrinting().create();String json = prettyGson.toJson(new Developer());System.out.println(json);System.out.println("Including the nulls ");Gson includeNullsGson = gsonBuilder.serializeNulls().create();String json2 = includeNullsGson.toJson(new Developer());System.out.println(json2); |
Обратите внимание на вывод для вышеупомянутого, classz включен
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
Default behaviour { "name": "ajduke", "languagesKnown": [ "Java", "Scala", "Ruby" ]}Including the nulls { "name": "ajduke", "classz": null, "languagesKnown": [ "Java", "Scala", "Ruby" ]} |
Включая пользовательское имя
По умолчанию имена выходных полей json совпадают с именами полей класса. Gson предоставляет способ изменить это с помощью аннотации.
Для этого нам нужно использовать аннотацию @serilizedName, предоставленную для поля, которое нам нужно изменить в имени вывода json.
Итак, наш класс Developer мы меняем имя на firstName
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
class Developer { @SerializedName("firstName") private String name; private String classz; List<String> languagesKnown; public Developer() { name = "ajduke"; languagesKnown = new ArrayList<>(); languagesKnown.add("Java"); languagesKnown.add("Scala"); languagesKnown.add("Ruby"); }} |
и если мы бежим вслед
|
01
02
03
04
05
06
07
08
09
10
|
Gson gson = new Gson();String json = gson.toJson(new Developer());System.out.println("********* Compact mode ***********");System.out.println(json); GsonBuilder gsonBuilder = new GsonBuilder();Gson prettyGson = gsonBuilder.setPrettyPrinting().create();json = prettyGson.toJson(new Developer());System.out.println("\n ******* Pretty formatting *********");System.out.println(json); |
тогда в выводе у нас будет «firstName» вместо «name»
|
01
02
03
04
05
06
07
08
09
10
11
12
|
********* Compact mode ***********{"firstName":"ajduke","languagesKnown":["Java","Scala","Ruby"]} ******* Pretty formatting *********{ "firstName": "ajduke", "languagesKnown": [ "Java", "Scala", "Ruby" ]} |
Запись JSON в / из потока
Библиотека Gson имеет одну перегрузку для каждого метода, toJson () и fromJson (), для записи и чтения из потоков соответственно. Проще говоря, вы можете записать вывод json в файл, символ или буфер, и вы можете читать из любого потока Reader.
Следующий листинг показывает, написание и чтение JSON в / из потока файлов
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package in.ajduke.ap013; import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.List; import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.annotations.SerializedName; public class GsonEx { public static void main(String[] args) throws IOException { Gson gson = new Gson(); System.out.println("Writing JSON to file ...."); // using try with resources try (FileWriter writer = new FileWriter("d:/output.json")) { gson.toJson(new Developer(), writer); // writing to file } System.out.println("Reading from file.. "); FileReader fileReader = new FileReader("d:/output.json"); dev= gson.fromJson(fileReader, Developer.class); System.out.println(dev); }}class Developer { private String name; private String classz; List<String> languagesKnown; public Developer() { name = "ajduke"; languagesKnown = new ArrayList<>(); languagesKnown.add("Java"); languagesKnown.add("Scala"); languagesKnown.add("Ruby"); } @Override public String toString() { return "Developer [name=" + name + ", classz=" + classz + ", languagesKnown=" + languagesKnown + "]"; }} |