Gson是一个可以将对象转为json和将json转为对象的一个开源库。由于其的简洁性,所以备受关注。今天就来将一个在使用时遇到的BUG。
当将一个json转为指定对象的对象时,结果一直为null。或将一个对象转为json时,结果也为null。
protected void onCreate(Bundle savedInstanceState) {
class Student{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Gson gson = new Gson();
String ad = gson.toJson(new Student("ad", 45));
Log.e(TAG, "onCreate: " + ad); // null
Student student = gson.fromJson(ad, Student.class);
Log.e(TAG, "onCreate: " + student.toString()); // 报空指针异常
}
这又是为什么呢?原因是:
Gson转换时会去底层获取该类的全局变量作为字段进行数据的填充,但因为是方法内部类,其在方法中,外部无法获取,所以就会导致底层无法获取到该类的全局变量,就会导致数据无法填充/转换,所以最终的结果就成了null了。
详细底层代码见:
public void toJson(Object src, Type typeOfSrc, JsonWriter writer) throws JsonIOException {
@SuppressWarnings("unchecked")
TypeAdapter<Object> adapter = (TypeAdapter<Object>) getAdapter(TypeToken.get(typeOfSrc));
// 拿到tyoe适配器,里面装了要转换/填充的字段名,没有的话就无法填充
...
}
创造不易,翻版时请带上源番。