android - 如何使用 moshi 反序列化泛型类成员?

标签 android retrofit moshi

我正在获取一个包含通用成员的 JSON 对象(数据可以是几种不同的类型)。该类目前看起来像这样:

@Parcelize
data class Children<T: Parcelable>(
        @Json(name = "type") val type: String,
        @Json(name = "data") val data: T
): Parcelable

如何使用 moshi 反序列化/映射正确的对象类型?

@Parcelize
data class Comment<T : Parcelable>(
    @Json(name = "replies") val replies: Children<T>,
    @Json(name = "count") val count: Int,
    @Json(name = "children") val childs: List<String>

) : Parcelable

或者像这样的例子怎么样?我应该注意到 Comment 可以采用 Comment 的通用参数,从而导致循环。

最佳答案

在 MoshiExtensions 中添加以下内联,并尝试相应地使用它们。

inline fun <reified E> Moshi.listAdapter(elementType: Type = E::class.java): JsonAdapter<List<E>> {
    return adapter(listType<E>(elementType))
}

inline fun <reified K, reified V> Moshi.mapAdapter(
        keyType: Type = K::class.java,
        valueType: Type = V::class.java): JsonAdapter<Map<K, V>> {
    return adapter(mapType<K, V>(keyType, valueType))
}

inline fun <reified E> listType(elementType: Type = E::class.java): Type {
    return Types.newParameterizedType(List::class.java, elementType)
}

inline fun <reified K, reified V> mapType(
        keyType: Type = K::class.java,
        valueType: Type = V::class.java): Type {
    return Types.newParameterizedType(Map::class.java, keyType, valueType)
}

关于android - 如何使用 moshi 反序列化泛型类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52578458/

相关文章:

android - 添加 LayoutParams 时出现 ClassCastException

java - SQLite 数据库中第 71 行的 NullPointerException

android - 具有多个订阅者的单个 Observable

android - codegen生成的适配器构造函数中的 `moshi`是什么意思?

android - 无法将 @drawable/转换为可绘制对象

android XML TableLayout 问题 : horizontal scroller going outside of right side of screen

android - 使用 OKHTTP3 证书固定进行改造

java - Android + Retrofit 2 + GSON = 无法为接口(interface)调用无参数构造函数

android - 无法访问 'LinkedHashTreeMap' : it's a public/*package*/com. squareup.moshi

java - 尝试从距离矩阵 api 获取距离数据总是返回 NULL