异常com.google.gson.internal.StringMap cannot be cast to XXX解决方案

来源:互联网 发布:杉帝网络 编辑:程序博客网 时间:2024/05/01 22:19

02-15 07:20:06.485: E/AndroidRuntime(1766): java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to com.bzjm.beans.Fshopinfo

这个问题困扰了我N天了,今天终于解决了。什么网上说的代码混淆都是扯淡……

异常描述

  • 期望使用一个方法将JsonArray字符串转换为对象List,方法运行结束后,结果List中的对象不能识别为传入的T对象类型,而是识别为一个Map导致后续出错。

先说下问题背景:

本来我通过下面的方法解析服务器的数据转换为List对象,解析成功没有问题,使用list.toString()方法可以打印出解析好的数据,但是当通过list.get(index)方法获取list对象中的某一特定对象时,就会报上面的那个异常,这让我苦闷了N天,在百度上百度了一堆,无果。今天终于找到了解决方案。


public static <T> List<T> getDatalist(String jsonString, Class<T> type) {List<T> list = new ArrayList<T>();Gson gson = new Gson();list = gson.fromJson(jsonString, new TypeToken<List<T>>() {}.getType());return list;}

调用方式 :

List<FShopInfo> list = getDatalist(jsonString,FShopInfo.class)

异常原因

  • 作为方法传入参数,Java编译过程会将泛型对象类型擦除。
  • “Java泛型的处理几乎都在编译器中进行,编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。” 
    如果通过调用方法的形式,方法中的new TypeToken<List<T>>(){}.getType(). 在运行时,泛型已经被擦除。


解决方案:

方案一:

不通过以上调用方法的形式传值,直接copy方法内的代码进行转换


方案二

先将Json对象转换为数组,再通过数组的形式,转换为list对象

public static <T> List<T> StringTolist(String jsonString, Class<T[]> type) {Gson gson = new Gson();T[] list  = gson.fromJson(jsonString, type);return Arrays.asList(list);}

调用方式(可以使用方法调用传入参数(数组不会在java编译过程中将类型擦除)):


List<FShopInfo> list = getDatalist(jsonString,FShopInfo[ ].class);



3 0
原创粉丝点击