1. 树模型准备JSON文档的内存树表示。它构建了一个JsonObject节点树。它是一种灵活的方法, 类似于XML的DOM解析器。
2. 从JSON创建树
2.1. 在读取JSON之后, JsonParser提供指向树的根节点的指针。根节点可用于遍历完整的树。请考虑以下代码段以获取提供的JSON字符串的根节点。
JsonParser parser = new JsonParser();
String jsonString = "{\"name\":\"张三\", \"age\":21,\"isMale\":false,\"marks\": [100,90,85]}";
JsonElement rootNode = parser.parse(jsonString);
3. 遍历树模型
3.1. 在遍历树并处理数据时, 使用到根节点的相对路径获取每个节点。以下代码段显示了如何遍历树。
JsonObject details = rootNode.getAsJsonObject();
JsonElement nameNode = details.get("name");
System.out.println("name: " +nameNode.getAsString());
JsonElement ageNode = details.get("age");
System.out.println("age: " + ageNode.getAsInt());
4. 例子
4.1. 新建一个名为GsonStream的Java项目, 同时添加相关jar包。
4.2. 新建student.java
package com.fj.t;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Boolean isMale;
private Integer[] sanWei;
private Collection<String> familyMembers;
private Map<String, String> scores;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean isMale() {
return isMale;
}
public void setMale(Boolean isMale) {
this.isMale = isMale;
}
public Integer[] getSanWei() {
return sanWei;
}
public void setSanWei(Integer[] sanWei) {
this.sanWei = sanWei;
}
public Collection<String> getFamilyMembers() {
return familyMembers;
}
public void setFamilyMembers(Collection<String> familyMembers) {
this.familyMembers = familyMembers;
}
public Map<String, String> getScores() {
return scores;
}
public void setScores(Map<String, String> scores) {
this.scores = scores;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", isMale=" + isMale + ", sanWei=" + Arrays.toString(sanWei)
+ ", familyMembers=" + familyMembers + ", scores=" + scores + "]";
}
}
4.3. 新建App1.java
package com.fj.t;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
public class App1 {
public static void main(String args[]) {
String jsonString = "{\"id\":1111,\"name\":\"张三\",\"isMale\":false,\"sanWei\":[100,90,85],\"familyMembers\":[\"爸爸\",\"妈妈\",\"妹妹\"],\"scores\":{\"chinese\":\"90\",\"english\":\"90\",\"math\":\"100\"}}";
JsonParser parser = new JsonParser();
JsonElement rootNode = parser.parse(jsonString);
Student student = new Student();
if (rootNode.isJsonObject()) {
JsonObject rootJO = rootNode.getAsJsonObject();
student.setId(rootJO.get("id").getAsInt());
student.setName(rootJO.get("name").getAsString());
student.setMale(rootJO.get("isMale").getAsBoolean());
JsonArray sanWeiJA = rootJO.getAsJsonArray("sanWei");
Integer[] sanWei = new Integer[sanWeiJA.size()];
for (int i = 0; i < sanWeiJA.size(); i++) {
sanWei[i] = sanWeiJA.get(i).getAsJsonPrimitive().getAsInt();
}
student.setSanWei(sanWei);
JsonArray familyMembersJA = rootJO.getAsJsonArray("familyMembers");
Collection<String> familyMembers = new ArrayList<String>();
for (int i = 0; i < familyMembersJA.size(); i++) {
familyMembers.add(familyMembersJA.get(i).getAsJsonPrimitive().getAsString());
}
student.setFamilyMembers(familyMembers);
Map<String, String> scores = new HashMap<String, String>();
JsonObject scoresJO = rootJO.getAsJsonObject("scores");
scores.put("chinese", scoresJO.get("chinese").getAsString());
scores.put("english", scoresJO.get("english").getAsString());
scores.put("math", scoresJO.get("math").getAsString());
student.setScores(scores);
}
System.out.println(student);
Type studentType = new TypeToken<Student>(){}.getType();
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
// T fromJson(JsonElement json, Class<T> classOfT)将指定的json解析树反序列化为指定类的对象。
System.out.println(gson.fromJson(rootNode, Student.class));
// T fromJson(JsonElement json, Type typeOfT)将指定的json解析树按指定类型的适配器将其反序列化为对象。
System.out.println((Student)gson.fromJson(rootNode, studentType));
}
}
4.4. 运行App1.java
4.5. 新建App2.java
package com.fj.t;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonIOException;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonWriter;
public class App2 {
public static void main(String[] args) {
Type studentType = new TypeToken<Student>(){}.getType();
Student student = new Student();
student.setId(1111);
student.setName("张三");
student.setMale(false);
Integer[] sanWei = {100,90,85};
student.setSanWei(sanWei);
Collection<String> familyMembers = new ArrayList<String>();
familyMembers.add("爸爸");
familyMembers.add("妈妈");
familyMembers.add("妹妹");
student.setFamilyMembers(familyMembers);
Map<String, String> scores = new HashMap<String, String>();
scores.put("chinese", "90");
scores.put("math", "100");
scores.put("english", "90");
student.setScores(scores);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
// JsonElement toJsonTree(Object src)将指定的对象序列化为解析树。
JsonElement je = gson.toJsonTree(student);
// String toJson(JsonElement jsonElement)将指定的json解析树序列化为JSON字符串。
System.out.println(gson.toJson(je));
// JsonElement toJsonTree(Object src, Type typeOfSrc) 将指定的对象按指定类型的适配器将其序列化为解析树。
JsonElement jeT = gson.toJsonTree(student, studentType);
try {
FileWriter fileWriter = new FileWriter(new File("student.txt"));
// void toJson(JsonElement jsonElement, Appendable writer)将指定的json解析树序列化为writer。
gson.toJson(jeT, fileWriter);
fileWriter.flush();
fileWriter.close();
} catch (JsonIOException | IOException e) {
e.printStackTrace();
}
Writer out = new StringWriter();
JsonWriter jw = new JsonWriter(out);
// void toJson(JsonElement jsonElement, JsonWriter writer)将指定的json解析树序列化为writer。
gson.toJson(jeT, jw);
System.out.println(out.toString());
}
}
4.6. 运行App2.java, 在项目根目录创建了student.txt