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;
}