Статьи

Использование Google GSON: дополнительные вкусности: часть I

Вступление

Эта статья дополняет предыдущую статью « Начало работы с 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 + "]";
  }
}