【发布时间】:2019-04-24 19:11:19
【问题描述】:
我需要我们的 GSON 解析器来处理数组与单个对象。我已经让它可以识别任何 MutableList 并落入下面的 Deserializer 适配器。但是,在实际将序列化为对象时,我错过了它不喜欢“T”类型的部分。我知道它此时需要该类型,但是鉴于我们这里有什么,我是否缺少能够推断出这一点的东西?
class JsonArrayObjectAdapter<T>: JsonDeserializer<MutableList<T>> {
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): MutableList<T> {
val list = mutableListOf<T>()
json?.let {
context?.let {
if (json.isJsonArray) {
for (element in json.asJsonArray) {
val obj: T = context.deserialize(element, T::class.java) // does not like this
list.add(obj)
}
} else if (json.isJsonObject) {
val obj: T = context.deserialize(json, T!!::class.java) // does not like this
list.add(obj)
}
}
}
return list
}
}
尝试使用 T::class.java 时出现此编译错误:
Cannot use 'T' as reified type parameter. Use a class instead.
这是我正在使用的数据类的示例,供参考:
data class ExampleDataClass(
@SerializedName("ExampleKey") val exampleVar: MutableList<ExampleSubDataClass>
)
这是我如何创建 gson:
val listType = object : TypeToken<MutableList<ExampleDataSubClass>>() {}.getType()
val gson = GsonBuilder()
.registerTypeAdapter(listType, JsonArrayObjectAdapter<ExampleDataSubClass>())
.create()
result = gson.fromJson(jsonString, ExampleDataClass::class.java)
【问题讨论】:
标签: android generics kotlin gson json-deserialization