![](/img/trans.png)
[英]Can't handle json tree list using TypeToken + generics with Gson in Kotlin
[英]Kotlin - Reading in list of objects from JSON using GSON and Type Generics (Android)
我有一个名为villagers.json
的 JSON 文件,格式如下
[
{
"name": "Admiral",
"iconFilename": "brd06.png",
"houseFilename": "brd06_39_Admiral.png",
"species": "Bird",
"gender": "Male",
"personality": "Cranky",
"hobby": "Nature",
"birthday": "01/27",
"catchphrase": "aye aye",
"favoriteSong": "Steep Hill",
"filename": "brd06",
"uid": "B3RyfNEqwGmcccRC3",
"colors": [
"Black",
"Blue"
],
"styles": [
"Cool",
"Cool"
]
},
{ ... },
etc.
]
以下代码片段用于从 Android 资产中的 JSON 文件中读取Villager
POJO 列表。
// this works
fun getVillagersFromJSON(context: Context): List<Villager> {
val jsonFileString = getJsonDataFromAsset(context, "villagers.json")
return Gson().fromJson(jsonFileString, object : TypeToken<List<Villager>>() {}.type)
}
但是,当尝试使用以下两个函数来生成 POJO 的类型时,出现com.google.gson.internal.LinkedTreeMap cannot be cast to Villager
错误。
fun getVillagersFromJSON(context: Context): List<Villager> {
val jsonFileString = getJsonDataFromAsset(context, "villagers.json")
jsonFileString?.let { return fromJson(it) }
return ArrayList()
}
// this use of type generics does NOT work
private inline fun <reified T> fromJson(json: String): List<T> {
return Gson().fromJson(json, object : TypeToken<List<T>>() {}.type)
}
使用 Kotlin、Gson 和键入 generics 从 JSON 文件中读取 POJO 列表的正确方法是什么?
我能够使用 generics 的最接近结果如下,尽管我仍在寻找更好的解决方案,我不需要明确指定所有类型的可能性。
fun getVillagersFromJSON(context: Context): List<Villager> {
val jsonFileString = getJsonDataFromAsset(context, "villagers.json")
jsonFileString?.let { return fromJson(it, Villager::class) }
return ArrayList<Villager>()
}
private inline fun <reified T : Any> fromJson(json: String, clazz: KClass<T>): List<T> {
return when (clazz) {
Villager::class -> Gson().fromJson(
json,object : TypeToken<List<Villager>>() {}.type
) as List<T>
// put other cases here
else -> ArrayList()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.