gson解析对象数组,使用泛型封装报错

 public class App {

    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();

        String json = "[{\"uid\":1,\"username\":\"user1\",\"password\":\"user1\",\"type\":\"普通\"},"
                + "{\"uid\":2,\"username\":\"user2\",\"password\":\"user2\",\"type\":\"普通\"},"
                + "{\"uid\":3,\"username\":\"user3\",\"password\":\"user3\",\"type\":\"普通\"}]";

        userList = jsonToBeanList(json, User.class);
        // 这个地方报错:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap 
        // cannot be cast to com.hezhujun.match.pojo.User
        for (User user : userList) {
            System.out.println(user);
        }

    }

    public static <T> List<T> jsonToBeanList(String json, Class<T> clas) {
        Gson gson = new Gson();
        List<T> list = gson.fromJson(json, new TypeToken<List<T>>() {
        }.getType());
        // 这个地方可以正常打印
        for (T t : list) {
            System.out.println(t);
        }
        return list;
    }

 

 

这是个泛型类型擦除问题
如果继续用gson.fromJson()方法,可以这样:

 Type type = com.google.gson.internal.$Gson$Types.newParameterizedTypeWithOwner(null, ArrayList.class, clas);
        List<T> list = gson.fromJson(json, type);

kotlin版本:

 fun <T> parseArrayList(json: String, clazz: Class<T>): ArrayList<T> {
    val type = com.google.gson.internal.
            `$Gson$Types`.newParameterizedTypeWithOwner(null, ArrayList::class.java, clazz) as Type
    return Gson().fromJson(json, type) as ArrayList<T>
}
 

需要Gson 2.2.4以上的版本

另外一种方法是:

 public static <T> List<T> jsonToBeanList(String json, Class<T> t) {
        List<T> list = new ArrayList<>();
        JsonParser parser = new JsonParser();
        JsonArray jsonarray = parser.parse(json).getAsJsonArray();
        for (JsonElement element : jsonarray
                ) {
            list.add(gson.fromJson(element, t));
        }
        return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值