写在前面
gson提供了一套强大的序列化、反序列化器。但某些场景下,如反序列化父子类时,gson现成反序列化器只能识别到父类的属性信息,子类属性会丢失。 普通的反序列化器是不能用的。需要自定义反序列化器,强加自己的业务逻辑。不是闲着蛋疼去实现自定义的序列化器。
举个栗子
school对象
public class School {
private String name;
private List<People> peopleList;
}
父类
public class People {
private String name;
private int age;
}
子类
public class Student extends People {
private Long cardId;
}
直接用gson现成的反序列化器
public static void main(String[] args) {
List<People> peopleList = Lists.newArrayList();
Student student = new Student("威少", 20, 666666L);
peopleList.add(student);
School school = new School("实验", peopleList);
String json = gson.toJson(school);
School r = gson.fromJson(json, School.class);
System.out.println(gson.toJson(r));
}
结果 :
{
"name": "实验",
"peopleList": [
{
"name": "威少",
"age": 20
}
]
}
如此一来,我们可以看出来,用gson默认的反序列化器,是会丢失student的cardId属性信息的。下面我们来解决这个问题
自定义反序列化器
- 实现接口 JsonDeserializer
重写方法
@Override
public VideoTemplate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
- 完成demo
public class JsonDeserializerDemo {
/**
* special gson
*/
private final static Gson gson;
static {
GsonBuilder gsonBuilder = new GsonBuilder();
JsonDeserializer<School> deserializer = new DefineDeserializer();
gsonBuilder.registerTypeAdapter(School.class, deserializer);
gson = gsonBuilder.create();
}
public static class DefineDeserializer implements JsonDeserializer<School> {
@Override
public School deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
School school = new School();
JsonObject jsonObject = json.getAsJsonObject();
JsonElement name = jsonObject.get("name");
school.setName(name.getAsString());
List<People> peopleList = new ArrayList<>();
school.setPeopleList(peopleList);
JsonArray jsonArray = json.getAsJsonObject().get("peopleList").getAsJsonArray();
for(JsonElement jsonElement : jsonArray) {
JsonObject asJsonObject = jsonElement.getAsJsonObject();
String stuName = asJsonObject.get("name").getAsString();
Long cardId = asJsonObject.get("cardId").getAsLong();
int age = asJsonObject.get("age").getAsInt();
Student student = new Student(stuName, age, cardId);
peopleList.add(student);
}
return school;
}
}
public static void main(String[] args) {
List<People> peopleList = Lists.newArrayList();
Student student = new Student("威少", 20, 666666L);
peopleList.add(student);
School school = new School("实验", peopleList);
String json = gson.toJson(school);
School r = gson.fromJson(json, School.class);
System.out.println(gson.toJson(r));
}
}
result
{
"name": "实验",
"peopleList": [
{
"cardId": 666666,
"name": "威少",
"age": 20
}
]
}
gson在反序列化时默认只能识别到父类属性,子类属性会被忽略。通过自定义JsonDeserializer接口,可以实现自定义的反序列化逻辑,以确保子类的cardId等特定属性不丢失。本文通过举例说明如何创建并应用自定义反序列化器。
1845

被折叠的 条评论
为什么被折叠?



