Android 当从共享pref获取时,GSON将以前存储的列表转换为LinkedTreeMaps的ArrayList

Android 当从共享pref获取时,GSON将以前存储的列表转换为LinkedTreeMaps的ArrayList,android,kotlin,gson,sharedpreferences,Android,Kotlin,Gson,Sharedpreferences,我希望能够使用GSON存储和获取对象的序列化列表 然而,当我试图获取列表时,我得到了LinkedTreeMaps的ArrayList的奇怪结构(每个都是对象属性) 以下是我将某物存储到prefs存储的方法: fun <T> putAsJson(key: String, valueObject: T?) { if (valueObject != null) { put(key, gson.toJson(valueObject)) } else {

我希望能够使用GSON存储和获取对象的序列化列表

然而,当我试图获取列表时,我得到了LinkedTreeMaps的ArrayList的奇怪结构(每个都是对象属性)

以下是我将某物存储到prefs存储的方法:

  fun <T> putAsJson(key: String, valueObject: T?) {
    if (valueObject != null) {
      put(key, gson.toJson(valueObject))
    } else {
      put(key, null)
    }
  }
fun putAsJson(key:String,valueObject:T?){
if(valueObject!=null){
put(key,gson.toJson(valueObject))
}否则{
put(键,空)
}
}
下面是我如何获得它的:

  inline fun <reified T: Any> getFromJson(key: String): T? {
    val jsonValue = get<String>(key)
    return try {
      gson.fromJson(jsonValue, T::class.java)
    } catch (ex: Exception) {
      Timber.e(ex, "Error when parsing JSON representing ${T::class.java} class")
      null
    }
  }
intline fun getFromJson(key:String):T?{
val jsonValue=get(键)
回击{
fromJson(jsonValue,T::class.java)
}捕获(例如:异常){
e(例如,“解析表示${T::class.java}class的JSON时出错”)
无效的
}
}
因此,我将其存储为:

fun saveSomeList(list: List<SomeObject>?) {
    someStorage.putAsJson(KEY, list)
  }
fun saveSomeList(list:list?){
someStorage.putAsJson(键,列表)
}
然后我试着用这个方法得到它:

  fun getSomeList(): List<SomeObject> {
    return someStorage.getFromJson<List<SomeObject>>(KEY) ?: emptyList()
  }
fun getSomeList():List{
返回someStorage.getFromJson(键)?:emptyList()
}
我做错了什么?

TypeTokens用于泛型类型序列化 对于集合(和其他泛型)类型,GSON无法自动提取正确的类型。您需要通过提供“类型令牌”来帮助它:

你的具体情况 我认为您最好的选择是列表的特定方法:

inline fun <reified T: Any> getListFromJson(key: String): T? {
    val jsonValue = get<String>(key)
    return try {
        val listType = TypeToken.getParameterized(List::class.java, T::class.java).type
        gson.fromJson(jsonValue, listType)
    } catch (ex: Exception) {
        Timber.e(ex, "Error when parsing JSON representing List<${T::class.java}> class")
        null
    }
}
getListFromJson(键:String):T?{
val jsonValue=get(键)
回击{
val listType=TypeToken.getParameterized(List::class.java,T::class.java)
fromJson(jsonValue,listType)
}捕获(例如:异常){
e(例如,“解析表示列表类的JSON时出错”)
无效的
}
}
资料来源:
-
-

// Unknown generic
val modelType = T::class.java
val listType = TypeToken.getParameterized(List::class.java, modelType).type
val list = gson.fromJson(jsonValue, listType)
inline fun <reified T: Any> getListFromJson(key: String): T? {
    val jsonValue = get<String>(key)
    return try {
        val listType = TypeToken.getParameterized(List::class.java, T::class.java).type
        gson.fromJson(jsonValue, listType)
    } catch (ex: Exception) {
        Timber.e(ex, "Error when parsing JSON representing List<${T::class.java}> class")
        null
    }
}