Gson 2.0以后序列化和反序列化 子类和父类中具备相同属性的bean会抛异常“class XXX declares multiple JSON fields named XXX”, 大体的处理方法有: 一、删除 父类或子类 中重复的属性 二、用 transient 关键字 修饰 子类或父类中不须要序列化的字段 三、为这个类单独注册TypeAdapter 测试代码以下:ide
Person.class测试
public class Person { private String name; private String age; // ignore getter and setter }
Student.classui
public class Student extends Person { private String name; private String score; // ignore getter and setter }
用gson处理student 会跑错以下code
String _stu = "{'name':'test','score':'100','age':'20'}"; Gson gson = new GsonBuilder().create(); Student stu = gson.fromJson(_stu, Student.class);
StudentTypeAdapter.class图片
public class StudentTypeAdapter extends TypeAdapter<Student> { @Override public void write(JsonWriter out, Student value) throws IOException { out.beginObject(); out.name("name").value(value.getName()); out.name("age").value(value.getAge()); out.name("score").value(value.getScore()); out.endObject(); } @Override public Student read(JsonReader in) throws IOException { Student student = new Student(); in.beginObject(); while (in.hasNext()) { String field = in.nextName(); if ("name".equals(field)) { student.setName(in.nextString()); } else if ("age".equals(field)) { student.setName(in.nextString()); } else if ("score".equals(field)) { student.setScore(in.nextString()); }else{ in.skipValue(); } } in.endObject(); return student; } }
这样运行就整常了ip
String _stu = "{'name':'test','score':'100','age':'20'}"; Gson gson = new GsonBuilder().registerTypeAdapter(Student.class, new StudentTypeAdapter()).create(); Student stu = gson.fromJson(_stu, Student.class);