Gson转换json结果为null

当使用Gson进行json与对象转换时,如果对象是方法内的内部类,由于其外部不可见性,会导致Gson无法获取其字段,从而转换结果为null。解决方法是避免使用内部类或者确保其可见性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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适配器,里面装了要转换/填充的字段名,没有的话就无法填充
    ...
}

创造不易,翻版时请带上源番。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值