gson json字符串转换

2 篇文章 0 订阅
2 篇文章 0 订阅

项目中, 有遇到用Google的Gson 来解析json字符串的,而且还遇到了一些问题,因此做了一些demo来总结一番。

 

首先,如果要转对象,则得保证对象没有重复序列号,即父,子类中都不包含重复的序列号,否则将会报序列号重复的错误。

如果有重复序列号的错误产生,依然还有其他方法来获取,那就是用list来接收,然后再进行转换赋值之类的操作即可。

重复序列号报错信息为:

 

Exception in thread "main" java.lang.IllegalArgumentException: class student.vo.Student declares multiple JSON fields named id
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
	at com.google.gson.Gson.getAdapter(Gson.java:356)
	at com.google.gson.Gson.fromJson(Gson.java:802)
	at com.google.gson.Gson.fromJson(Gson.java:768)
	at com.google.gson.Gson.fromJson(Gson.java:717)
	at com.google.gson.Gson.fromJson(Gson.java:689)
	at student.main.MainProject.main(MainProject.java:14)


接下来就进行几个例子的讲解:

 

 

首先:定义一个Person父类,先不管此类用不用,先继承Serializable接口

 

// 定义一个Person父类
public class Person implements Serializable {

	/**
	 * author:xiaogaoxaing
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * id,对应数据库表中的主键
	 */
	protected String id;

	/**
	 * 获取vo的id
	 * 
	 * @return
	 */
	public String getId() {
		return id;
	}

	/**
	 * 设置vo的id
	 * 
	 * @param id
	 */
	public void setId(String id) {

		this.id = id;
	}

}


然后:定义一个Student类,下面主要操作的类,别看有这么多字段,下面只用到几个而已!

 

 

// 先来定义一个实体类Student,实现序列化接口
public class Student implements Serializable{
	
	/**
	 * author:xiaogaoxaing
	 */
	private static final long serialVersionUID = 1L;
	private String id;
	private String name;
	private String age;
	private String chinese;
	private String math;
	private String english;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getChinese() {
		return chinese;
	}
	public void setChinese(String chinese) {
		this.chinese = chinese;
	}
	public String getMath() {
		return math;
	}
	public void setMath(String math) {
		this.math = math;
	}
	public String getEnglish() {
		return english;
	}
	public void setEnglish(String english) {
		this.english = english;
	}
	
}

 

 

 

 

 

最后:分别给出三个例子来讲解一下如何json字符串转 实体类对象、 实体类对象的集合变量、 ma的集合变量

 

第一个:

 

// 测试类一:拼接的 json格式字符串 转 实体类对象
//(实体类不能够包含重复序列化的操作,如果Student继承了Person类,则此方法不可用)
public class MainProject {
	
	public static void main(String[] args) {
		Gson gson =  new Gson();
		// 随机乱序的给json字符串赋值,这里必须不能有[]括号符号!
		String strJson = "{\"chinese\":\"110\",\"name\":\"nature\",\"age\":\"117\"}";
		// 打印输出json格式字符串信息
		System.out.println(strJson);
		// 此时即可用实体类对象的集合变量来 接收 json字符串 转 集合对象
		Student stu = gson.fromJson(strJson, Student.class);
		System.out.println(stu.getChinese()+"<<<>>>"+stu.getAge()+"<<<>>>"+stu.getName());
	}
}


第二个:

 

 

// 测试类二:拼接的 json格式字符串 转 对象的集合变量
//(实体类不能够包含重复序列化的操作,如果Student继承了Person类,则此方法不可用)
public class MainProject {
	
	public static void main(String[] args) {
		Gson gson =  new Gson();
		// 随机乱序的给json字符串赋值,这里必须要有[]括号符号,区别测试类二
		String strJson = "[{\"chinese\":\"110\",\"name\":\"nature\",\"age\":\"117\"}]";
		// 打印输出json格式字符串信息
		System.out.println(strJson);
		// 此时即可用实体类对象的集合变量来 接收 json字符串 转 集合对象
		//(这个实体类必须不能有重复的序列化操作,比如继承了父类对id这个字段有实例化操作)
		List<Student> stuList = gson.fromJson(strJson, new TypeToken<List<Student>>(){}.getType());
		System.out.println(stuList);
		for(Student stu : stuList)
		{
			System.out.println(stu.getChinese()+"<<<>>>"+stu.getAge()+"<<<>>>"+stu.getName());
		}
	}
}


第三个:

 

 

// 测试类三:拼接的 json格式字符串 转 map类型的集合变量(用来解决含有重复序列化的实体类)
public class MainProject {
	
	public static void main(String[] args) {
		Gson gson =  new Gson();
		// 随机乱序的给json字符串赋值,这里必须要有[]括号符号,区别测试类二
		String strJson = "[{\"chinese\":\"110\",\"name\":\"nature\",\"age\":\"117\"}]";
		// 打印输出json格式字符串信息
		System.out.println(strJson);
		// 此时即可用实体类对象的集合变量来 接收 json字符串 转 集合Map变量
		List<Map<String, String>> stuList = gson.fromJson(strJson, new TypeToken<List<Map<String, String>>>(){}.getType());
		System.out.println(stuList);
		// 循环这个map的集合变量即可
		for(Map<String, String> stu : stuList)
		{
			System.out.println(stu.get("chinese")+"<<<>>>"+stu.get("age")+"<<<>>>"+stu.get("name"));
		}
	}
}


以上为总结的三种方式,当然只是简单的json字符串格式,后续再总结复杂json字符串。

 

有问题的提一下。谢谢

 

更多精彩敬请关注公众号

Java极客思维

微信扫一扫,关注公众号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值