Как десериализовать общих учеников с моши? - PullRequest
0 голосов
/ 30 сентября 2018

Я получаю объект 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, что приводит к циклу.

1 Ответ

0 голосов
/ 22 октября 2018

Добавьте ниже строки в 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)
}
...