项目中, 有遇到用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极客思维
微信扫一扫,关注公众号