介绍
这是以前的Google GSON入门的后续文章,其中显示了有关使用Google Gson的入门资料。
本文显示了GSON库的一些其他优点。 由于有很多关于这些额外功能的文章要写,所以我将长篇文章分成2个系列,因此,这是其中一部分,在下一篇文章中,我将发布其余内容。
使用GSON库的好处在于,它不需要任何注释或配置即可进行简单转换。 尽管它使用默认配置来使事情变得简单。 GSON具有从Java对象创建Json的灵活性,反之亦然。 我们真正的Gson类包含json转换的许多默认值,但是我们可以使用GsonBuilder类覆盖默认值。 因此,让我们开始吧。
漂亮格式的JSON输出
当您打印使用Gson创建的json输出字符串时,您将在一行中看到输出,如下所示
{"name":"ajduke","languagesKnown":["Java","Scala","JavaScript"]}
这是称为压缩模式的默认格式化模式。 当您的json具有很多字段和组件时,阅读起来会变得更加困难。 为了正确格式化,该库具有漂亮的漂亮格式化模式,该模式将每一字段打印在一行中
要使用此功能,您需要使用GsonBuilder#setPrettyPrinting()创建Gson实例,如以下清单所示
以下是我们的类,其对象将转换为其json表示形式,
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个使用,
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);
上面的输出是
********* Compact mode ***********
{"name":"ajduke","languagesKnown":["Java","Scala","Ruby"]}******* Pretty formatting *********
{"name": "ajduke","languagesKnown": ["Java","Scala","Ruby"]
}
在JSON输出中包含空字段
默认情况下,在转换为Json格式时,在转换中会忽略空值字段。 这仅仅是为了使输出清晰紧凑。
但是我们可以通过使用GsonBuilder #serializeNulls()创建Gson实例来覆盖此行为。 以下清单显示
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行
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
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
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");}
}
如果我们跟随
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”
********* Compact mode ***********
{"firstName":"ajduke","languagesKnown":["Java","Scala","Ruby"]}******* Pretty formatting *********
{"firstName": "ajduke","languagesKnown": ["Java","Scala","Ruby"]
}
向/从流写入JSON
Gson库对每个方法toJson()和fromJson()都有一个重载,分别用于写入和读取流。 简单来说,您可以将json输出写入文件,字符或缓冲区,并且可以从任何Reader流中读取。
以下清单显示了如何在File流中写入和读取JSON
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 resourcestry (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");}@Overridepublic String toString() {return "Developer [name=" + name + ", classz=" + classz+ ", languagesKnown=" + languagesKnown + "]";}
}
翻译自: https://www.javacodegeeks.com/2014/01/using-google-gson-extra-goodies-part-i.html