Bug
com.google.gson.internal.LinkedTreeMap cannot be cast to XXX
public class BaseResponse<T> {
public String status;
public String msg;
public int code;
public T data;
欲使用 Gson.fromJson
解析出 BaseResponse<ArrayList<Channel>>
:
val response:BaseResponse<ArrayList<Channel>> = fromJson<BaseResponse<ArrayList<Channel>>>(result)
Debug 下可以看到,集合中的元素都是 LinkedTreeMap
包装过的数据直接使用肯定是出问题的 , 如图 :
此时编译器提示的结果不是正确的 :
必须要对 LinkedTreeMap
进行转换 :
val toJsonTree = Gson().toJsonTree(response.data)
val testChannels: List<Channel> = Gson().fromJson<List<Channel>>(toJsonTree, object : TypeToken<List<Channel>>() {}.type)
testChannels.forEach {
L.e("testChannels ${it.title}")
Over 🚀
另附 GsonExt
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonParser
import com.google.gson.JsonSyntaxException
import org.json.JSONException
import org.json.JSONObject
import java.lang.reflect.Type
import java.util.*
* Title: GsonExt
* Description: com.google.gson.Gson
* @author javakam
* @date 2019/12/17 10:13
private val sGson = createGson()
private fun createGson(): Gson? {
synchronized(Gson::class.java) {
return sGson ?: GsonBuilder().serializeNulls().create()!!
* 将对象转成jsonString
fun <T> toJsonString(t: T): String = createGson()?.toJson(t).toString()
@Throws(JSONException::class)
fun toJson(obj: Any?): JSONObject = JSONObject(createGson()?.toJson(obj) ?: "")
// 在 kotlin 中扩展 Java 类的 Gson.fromJson 方法
// 不在传入 T 的class,inline 的作用就是将函数插入到被调用处,配合 reified 就可以获取到 T 真正的类型
inline fun <reified T : Any> fromJson(json: String): T {
return Gson().fromJson(json, T::class.java)
* 将json字符串转成对象
@Throws(JsonSyntaxException::class)
fun <T> fromJson(json: String?, cla: Class<T>?): T = createGson()?.fromJson(json, cla)!!
* new TypeToken<List></List><Music>>(){}.getType()
@Throws(JsonSyntaxException::class)
fun <T> fromJson(jsonStr: String?, type: Type?): List<T> {
return createGson()?.fromJson(jsonStr, type) ?: emptyList()
复制代码