006_Gson定制型适配器

本文介绍了如何使用Gson库创建自定义适配器,以实现Java对象到JSON及反之的转换。首先,通过扩展`TypeAdapter`类并重写`read`和`write`方法来创建自定义适配器,然后使用`GsonBuilder`注册该适配器,并设置Gson实例。最后,展示了如何在实际应用中使用自定义适配器进行序列化和反序列化操作。
摘要由CSDN通过智能技术生成

1. Gson使用其内置适配器执行对象的序列化/反序列化。它还支持自定义适配器。我们将讨论如何创建自定义适配器以及如何使用它。

2. 创建自定义适配器

2.1. 通过扩展TypeAdapter类并将其传递给目标对象的类型来创建自定义适配器。重写读取和写入方法以分别执行自定义反序列化和序列化。

class StudentAdapter extends TypeAdapter<Student> {
   @Override
   public Student read(JsonReader reader) throws IOException {
      ...
   }
   @Override
   public void write(JsonWriter writer, Student student) throws IOException {
   }
}

3. 注册自定义适配器

3.1. 使用GsonBuilder注册自定义适配器和使用创造GSON实例GsonBuilder。

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Student.class, new StudentAdapter());
Gson gson = builder.create();

4. 使用适配器

4.1. Gson现在将使用自定义适配器将Json文本转换为对象, 反之亦然。

String jsonString = "{\"id\":1, \"name\":\"张三\"}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);  
jsonString = gson.toJson(student);
System.out.println(jsonString);

5. 例子

5.1. 新建一个名为GsonAdapter的Java项目, 同时添加相关jar包。

5.2. 新建Student.java

package com.fj.a;

public class Student {
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String toString() {
		return "Student [id = " + id + ", name = " + name + "]";
	}
}

5.3. 新建StudentAdapter.java

package com.fj.a;

import java.io.IOException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

class StudentAdapter extends TypeAdapter<Student> {
	@Override
	public Student read(JsonReader reader) throws IOException {
		Student student = new Student();
		reader.beginObject();
		String fieldname = null;

		while (reader.hasNext()) {
			JsonToken token = reader.peek();

			if (token.equals(JsonToken.NAME)) {
				fieldname = reader.nextName();
			}
			
			if ("id".equals(fieldname)) {
				token = reader.peek();
				student.setId(reader.nextInt());
			}
			if ("name".equals(fieldname)) {
				token = reader.peek();
				student.setName(reader.nextString());
			}
		}
		reader.endObject();
		return student;
	}

	@Override
	public void write(JsonWriter writer, Student student) throws IOException {
		writer.beginObject();
		writer.name("id");
		writer.value(student.getId());
		writer.name("name");
		writer.value(student.getName());
		writer.endObject();
	}
}

5.4. 新建App.java

package com.fj.a;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class App {
	public static void main(String args[]) {
		GsonBuilder builder = new GsonBuilder();
		builder.registerTypeAdapter(Student.class, new StudentAdapter());
		builder.setPrettyPrinting();
		Gson gson = builder.create();

		String jsonString = "{\"id\":1, \"name\":\"张三\"}";
		Student student = gson.fromJson(jsonString, Student.class);
		System.out.println(student);

		jsonString = gson.toJson(student);
		System.out.println(jsonString);
	}
}

5.5. 运行App.java

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值