[英]A function to convert JSONArray to list of generic type
我有 JSON 数据表单响应看起来像这样
{
"message": "",
"data" : [...]
}
data
包含一个数组
data class News(
@SerializedName("id") val id: Int,
@SerializedName("title") val title: String,
@SerializedName("description") val desc: String
)
或者
data class Product(
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String
)
基于我击中的端点。
为了从 json 对象获取数据,我创建了 2 个函数
fun JSONObject.toNewsList() = Gson().fromJson<List<News>>(getJSONArray("data").toString(),
object : TypeToken<List<News>>(){}.type)!!
fun JSONObject.toProductList() = Gson().fromJson<List<Product>>(getJSONArray("data").toString(),
object : TypeToken<List<Product>>(){}.type)!!
这些函数工作得很好,直到我尝试将它们组合成一个使用泛型类型的函数,因为参数看起来像这样
fun <T> JSONObject.toList() = Gson().fromJson<List<T>>(getJSONArray("data").toString(),
object : TypeToken<List<T>>(){}.type)!!
每当我调用函数jsonResponse.toList<News>()
,它总是返回错误com.google.gson.internal.LinkedTreeMap cannot be cast to com.example.News
知道我哪里出错了,以及如何解决它?
编辑:我项目中的每个响应总是作为加密字符串接收,这就是为什么我必须自己映射响应并且不能将响应类型放在Call
方法中。 这是我的Call
功能看起来像
@POST("endpoint")
fun service(@Body body: RequestBody): Call<String>
您可以像这样使用TypeToken.getParameterized
:
inline fun <reified T> JSONObject.toList(): List<T> {
val typeToken = TypeToken.getParameterized(List::class.java, T::class.java)
return Gson().fromJson<List<T>>(json, typeToken.type)!!
}
您的response
类应如下所示
class ResponseList<E> {
var message:String
var data:ArrayList<E>
}
你可以像这样调用你的API
@GET("url")
fun getNews():Call<ResponseList<News>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.