004_Gson树模型

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
public String selectyearReportDataTest2(YearReportData yearReportData){ int l_iID = 1; List<YearReportData> yearList = jiguanService.selectyearReportYearData(yearReportData); //搜索年數據 //循環寫入子節點 for (YearReportData l_dataYear:yearList) { l_dataYear.setId(l_iID++); l_dataYear.setDate(l_dataYear.getDate()+"年"); List<YearReportData> quarterList = jiguanService.selectyearReportQuarterData(l_dataYear); //获取季度数据 for (YearReportData l_dataQuarter:quarterList) { l_dataQuarter.setId(l_iID++); l_dataQuarter.setDate(l_dataQuarter.getDate()+ "季度"); //获取对应季度的月数据 List<YearReportData> monthList = jiguanService.selectyearReportMonthData(l_dataQuarter); //搜索年报月数据 for (YearReportData l_dataMonth:monthList) { l_dataMonth.setId(l_iID++); l_dataMonth.setDate(l_dataMonth.getDate() + "月"); //获取对应月的日数据 List<YearReportData> dayList = jiguanService.selectyearReportMonthData(l_dataMonth); l_dataMonth.setChildren(dayList); } l_dataQuarter.setChildren(monthList); //季度中写入月数据 } l_dataYear.setChildren(quarterList); } Gson l_gson = new Gson(); //Gson方法初始化 String l_JsonAllData = l_gson.toJson(yearList); return l_JsonAllData; }这个方法中,定义的json状结构中日期显示不对,年报中的年数据和日数据不对应,这个方法直接把数据库中所有的日期数据都加到了其中一年里边,我想要的json状结构是年数据对应日数据,不要这种年数据混在一块的
05-11
根据你提供的代码,可以看出在搜索年报月数据时,使用了错误的方法 `selectyearReportMonthData`,应该使用正确的方法 `selectyearReportDayData` 来搜索年报日数据,这样就可以正确地获取对应月的日数据,从而解决日期显示不对的问题。 修改方法如下: ``` public String selectyearReportDataTest2(YearReportData yearReportData){ int l_iID = 1; List<YearReportData> yearList = jiguanService.selectyearReportYearData(yearReportData); //搜索年數據 //循環寫入子節點 for (YearReportData l_dataYear : yearList) { l_dataYear.setId(l_iID++); l_dataYear.setDate(l_dataYear.getDate() + "年"); List<YearReportData> quarterList = jiguanService.selectyearReportQuarterData(l_dataYear); //获取季度数据 for (YearReportData l_dataQuarter : quarterList) { l_dataQuarter.setId(l_iID++); l_dataQuarter.setDate(l_dataQuarter.getDate() + "季度"); //获取对应季度的月数据 List<YearReportData> monthList = jiguanService.selectyearReportMonthData(l_dataQuarter); //搜索年报月数据 for (YearReportData l_dataMonth : monthList) { l_dataMonth.setId(l_iID++); l_dataMonth.setDate(l_dataMonth.getDate() + "月"); //获取对应月的日数据 List<YearReportData> dayList = jiguanService.selectyearReportDayData(l_dataMonth); //搜索年报日数据 l_dataMonth.setChildren(dayList); } l_dataQuarter.setChildren(monthList); //季度中写入月数据 } l_dataYear.setChildren(quarterList); } Gson l_gson = new Gson(); //Gson方法初始化 String l_JsonAllData = l_gson.toJson(yearList); return l_JsonAllData; } ``` 在修改后的代码中,通过修改获取年报日数据的方法,确保了日期的正确显示,同时也更加符合预期的状结构,年数据对应日数据,不会出现混在一起的现象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值