Google Gson是一个开源的,基于Java的类库。它是由Google开发的,使用Gson有助于将Java对象序列化为JSON,反之亦然。
下面是Gson的特点:
- 易于使用 - Gson API提供了一个高级外观来简化常用的用例。
- 无需创建映射 - Gson API为大部分要序列化的对象提供了默认映射。
- 性能优 - Gson速度相当快,内存占用量低。 它适用于大型对象图或系统。
- 干净JSON - Gson创建一个干净而紧凑的JSON结果,它易于阅读。
- 无依赖性—Gson库不需要JDK以外的任何其他库。
- 开源 - Gson库是开源的; 它是免费提供的。
我们为什么使用Gson,不光是因为Gson有上面的特点,还有下面的原因:
- 标准化 - Gson是一个由Google管理的标准化库。
- 高效 - 这是对Java标准库的可靠,快速和高效的扩展。
- 优化 - Gson库经过高度优化。
- 支持泛型 - 它为泛型提供了广泛的支持。
- 支持复杂的内部类 - 它支持具有深度继承层次结构的复杂对象。
下面是处理JSON的三种方法:
- 流媒体API,它读取和写入JSON内容作为离散事件。JsonReader和JsonWriter将数据读取/写入令牌,称为JsonToken。流媒体API是处理JSON的三种方法中最强大的方法。它具有最低的开销,并且在读/写操作中速度非常快。它类似于用于XML的Stax解析器。
- 树模型,它准备JSON文档的内存树表示。它构建了一个JsonObject节点树。这是一种灵活的方法,类似于XML的DOM解析器。
- 数据绑定,它使用属性访问器将JSON转换为POJO(普通旧Java对象)并从中转换。Gson使用数据类型适配器读取/写入JSON。 它类似于XML的JAXB解析器。
1. Gson类
Gson是Google Gson库的主要操作类。它提供了将Java对象转换为匹配的JSON结构的功能,反之亦然。 Gson首先使用GsonBuilder构建,然后使用toJson(Object)或fromJson(String,Class)方法读取/写入JSON构造。
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
Article article = new Article(1, "My Article");
String articleStr = gson.toJson(article);
System.out.println(articleStr);
Article article2 = gson.fromJson(articleStr, Article.class);
System.out.println(article2);
2. Gson对象序列化
即将一个Java对象序列化为一个Json文件,然后读取该Json文件以获取对象。
public class GsonDemo {
public static void main(String[] args) {
try {
GsonDemo demo = new GsonDemo();
Article article = new Article(1, "My Article");
demo.writeJSON(article);
Article article2 = demo.readJSON();
System.out.println(article2);
} catch (IOException e) {
e.printStackTrace();
}
}
private void writeJSON(Article article) throws IOException {
FileWriter writer = new FileWriter("article.json");
writer.write(new GsonBuilder().create().toJson(article));
writer.close();
}
private Article readJSON() throws JsonSyntaxException, JsonIOException, FileNotFoundException {
return new GsonBuilder().create().fromJson(
new BufferedReader(new FileReader("article.json")), Article.class);
}
}
3. Gson数据绑定
数据绑定API用于使用属性访问器或使用注释将JSON转换为POJO或从POJO转换为JSON。Gson有两种类型数据绑定:
原始数据绑定 - 将JSON转换为Java地图,列表,字符串,数字,布尔值和NULL对象。
对象数据绑定 - 从任何JAVA类型转换JSON。
原始数据绑定是指将JSON映射到JAVA核心数据类型和内置集合。Gson提供了各种内置适配器,可用于序列化/反序列化原始数据类型。
public class GsonDemo2 {
public static void main(String[] args) {
Gson gson = new Gson();
int id = 1;
String title = "Gson";
String[] labels = {"Gson","Json"};
//序列化
System.out.println("{");
System.out.println("id: " + gson.toJson(id) +",");
System.out.println("title: " + gson.toJson(title) +",");
System.out.println("labels: " + gson.toJson(labels) +",");
System.out.println("}");
//反序列化
id = gson.fromJson("1", Integer.class);
title = gson.fromJson("\"Gson\"", String.class);
labels = gson.fromJson("[\"Gson\",\"Json\"]", String[].class);
System.out.println("id: " + id);
System.out.println("title: " + title);
System.out.println("labels:" + Arrays.toString(labels));
}
}
对象数据绑定是指将JSON映射到任何JAVA对象。
public class GsonDemo2 {
public static void main(String[] args) {
Gson gson = new Gson();
Article article = new Article(1, "My Article");
String jsonStr = gson.toJson(article);
System.out.println(jsonStr);
Article article2 = gson.fromJson(jsonStr, Article.class);
System.out.println(article2);
}
}
4. Gson树模型
树模型准备JSON文档的内存树表示。它构建了一个JsonObject节点树。这是一种灵活的方法,类似于XML的DOM解析器。
public class GsonDemo2 {
public static void main(String[] args) {
String jsonStr = "{\"id\":1, \"title\":\"Gson\", \"labels\": [\"Gson\",\"Json\"]}";
/**
* 1. 从JSON创建树。
* 在读取JSON之后,JsonParser提供了一个指向树的根节点的指针。根节点可以用来遍历整个树。
*/
JsonParser parser = new JsonParser();
JsonElement rootNode = parser.parse(jsonStr);
/**
* 2. 遍历树模型。
* 在遍历树并处理数据时,使用到根节点的相对路径获取每个节点。
*/
if (rootNode.isJsonObject()) {
JsonObject details = rootNode.getAsJsonObject();
JsonElement idNode = details.get("id");
System.out.println("Id: " + idNode.getAsInt());
JsonElement titleNode = details.get("title");
System.out.println("Title: " + titleNode.getAsString());
JsonArray labels = details.getAsJsonArray("labels");
for (int i = 0; i < labels.size(); i++) {
JsonPrimitive value = labels.get(i).getAsJsonPrimitive();
System.out.print(value.getAsString() + " ");
}
}
}
}
5. Gson数据流
Streaming API用于通过令牌读取JSON令牌。它读取和写入JSON内容作为离散事件。JsonReader和JsonWriter将数据读取/写入令牌,称为JsonToken。
public class GsonDemo2 {
public static void main(String[] args) {
String jsonStr = "{\"id\":1, \"title\":\"Gson\", \"labels\": [\"Gson\",\"Json\"]}";
try {
handleJsonObject(new JsonReader(new StringReader(jsonStr)));
} catch (IOException e) {
e.printStackTrace();
}
}
private static void handleJsonObject(JsonReader reader) throws IOException {
reader.beginObject();
String field = null;
while (reader.hasNext()) {
JsonToken token = reader.peek();
if (token.equals(JsonToken.BEGIN_ARRAY)) {
System.out.print("Labels: [ ");
handleJsonArray(reader);
System.out.print("]");
} else if (token.equals(JsonToken.END_OBJECT)) {
reader.endObject();
return;
} else {
if (token.equals(JsonToken.NAME)) {
field = reader.nextName();
}
if ("id".equals(field)) {
token = reader.peek();
System.out.println("Id:" + reader.nextInt());
}
if ("title".equals(field)) {
token = reader.peek();
System.out.println("Title: " + reader.nextString());
}
}
}
}
private static void handleJsonArray(JsonReader reader) throws IOException {
reader.beginArray();
while (true) {
JsonToken token = reader.peek();
if (token.equals(JsonToken.END_ARRAY)) {
reader.endArray();
return;
} else if (token.equals(JsonToken.BEGIN_OBJECT)) {
handleJsonObject(reader);
} else if (token.equals(JsonToken.END_OBJECT)) {
reader.endObject();
} else {
System.out.print(reader.nextString() + ", ");
}
}
}
}