最近在项目中有一个场景,需要将一个json串转成对象,但是由于泛型的存在,导致对象无法转换。下面是我的代码:
String jsonStr = "{\"name\":\"张三\",\"age\":20,\"gender\":\"男\"}"; Class clz = Student.class; T obj = new Gson().fromJson(jsonStr, clz);
其中,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);
以上就是本次遇到的问题及解决方法的介绍,希望能对大家有所帮助。