Android 当从共享pref获取时,GSON将以前存储的列表转换为LinkedTreeMaps的ArrayList
我希望能够使用GSON存储和获取对象的序列化列表 然而,当我试图获取列表时,我得到了LinkedTreeMaps的ArrayList的奇怪结构(每个都是对象属性) 以下是我将某物存储到prefs存储的方法: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 {
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
}
}