淘先锋技术网

首页 1 2 3 4 5 6 7

最近在项目中有一个场景,需要将一个json串转成对象,但是由于泛型的存在,导致对象无法转换。下面是我的代码:


String jsonStr = "{\"name\":\"张三\",\"age\":20,\"gender\":\"男\"}";
Class clz = Student.class;
T obj = new Gson().fromJson(jsonStr, clz);

json串转成对象泛型转不了

其中,Student是一个自定义的类,可以正确转换。但是一旦将上面代码中的clz改为泛型,就会报错:


String jsonStr = "{\"name\":\"张三\",\"age\":20,\"gender\":\"男\"}";
Type type = new TypeToken>(){}.getType();
List students = new Gson().fromJson(jsonStr, type);

报错信息如下:


java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.example.demo.Student

通过查阅资料,发现是因为 Gson 在将 json 转换成对象时,遇到 List 类型或者其他泛型类型时,会将这个泛型擦除,简化为 Object 类型。所以当将泛型转换成具体对象时,会因为转换类型不匹配而报错。

解决方法是,在将 json 转换成对象时,使用 TypeToken 来获取泛型类型,具体代码参考如下:


String jsonStr = "{\"name\":\"张三\",\"age\":20,\"gender\":\"男\"}";
Type type = new TypeToken>(){}.getType();
List students = new Gson().fromJson(jsonStr, type);

以上就是本次遇到的问题及解决方法的介绍,希望能对大家有所帮助。