gpt4 book ai didi

android - GSON 在从共享 prefs 获取时将之前存储的 List 转换为 LinkedTreeMaps 的 ArrayList

转载 作者:行者123 更新时间:2023-11-29 23:13:09 25 4
gpt4 key购买 nike

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

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

这是我将一些东西存储到偏好存储的方法:

  fun <T> putAsJson(key: String, valueObject: T?) {
if (valueObject != null) {
put(key, gson.toJson(valueObject))
} else {
put(key, null)
}
}

这是我获得它的方式:

  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
}
}

所以我只是将其存储为:

fun saveSomeList(list: List<SomeObject>?) {
someStorage.putAsJson(KEY, list)
}

然后我尝试使用这种方法获取它:

  fun getSomeList(): List<SomeObject> {
return someStorage.getFromJson<List<SomeObject>>(KEY) ?: emptyList()
}

我做错了什么?

最佳答案

用于通用类型序列化的 TypeTokens

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

// Known list
val ints = listOf(1, 2, 3)
val collectionType = object : TypeToken<Collection<Int>>() {}.type
val json = gson.toJson(ints, collectionType)
val ints2: List<Int> = gson.fromJson(json, collectionType)

// Known generic
val foo = Foo<Bar>()
val fooType = object : TypeToken<Foo<Bar>>() {}.type
val json = gson.toJson(foo, fooType)
val foo2: Foo<Bar> = gson.fromJson(json, fooType)

如果您想保持内部类型的通用性,即 List<T> 中的 T ,你可以这样做:

// 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
}
}

来源:
- https://github.com/google/gson/blob/master/UserGuide.md#TOC-Collections-Examples
- https://stackoverflow.com/a/44303909/2957169

关于android - GSON 在从共享 prefs 获取时将之前存储的 List 转换为 LinkedTreeMaps 的 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55754863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com