繁体   English   中英

Kotlin - 使用 GSON 和类型 Generics (Android) 从 JSON 读取对象列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM