Невозможно создать конвертер для класса, требуется явная регистрация JsonAdapter - PullRequest
0 голосов
/ 09 июля 2020

У меня есть класс (StickerDto), используемый для хранения данных, поступающих из вызова API, который включает в себя список другого класса (Sticker):

@JsonClass(generateAdapter = true)
class StickerDto(
        @Json (name = "totalAnimatedStickers") val total: Int,
        @Json(name = "pages") val pages: Int,
        @Json(name = "data") val stickers: List<Sticker>

)



@JsonClass(generateAdapter = true)
class Sticker(
        @Json(name = "name") val name: String,
        @Json(name = "id") val id: String,
        @Json(name = "stickerData") val stickerData: JSONObject,
        var isSelected:Boolean = false
)

Обратите внимание, что тип данных для «stickerData» Атрибут в классе Sticker имеет тип JSONObject, который отправляется серверной частью. Моя проблема началась, когда я переключил его на этот тип данных с типа String. Причина, по которой я сделал , что , заключается в том, что у меня есть специальный адаптер Json, который пропускает объект JSON, потому что он ожидает строку.

internal class SkipBadElementsListAdapter(private val elementAdapter: JsonAdapter<Any?>) : JsonAdapter<List<Any?>>() {

    object Factory : JsonAdapter.Factory {
     
    override fun fromJson(reader: JsonReader): List<Any?>? {
        val result = mutableListOf<Any?>()
        reader.beginArray()
        while (reader.hasNext()) {
            try {
                val peeked = reader.peekJson()
                result.add(elementAdapter.fromJson(peeked))
            } catch (e: JsonDataException) {
                Timber.w(e, "Item skipped while parsing:")
            }
            reader.skipValue()
        }
        reader.endArray()
        return result
    }

}

Сложность в том, что это приложение спроектирован так, что все вызовы API используют один и тот же клиент Retrofit, который построен с использованием этого адаптера:

  private fun createNewUserApiClient(authRefreshClient: AuthRefreshClient,
                                       preferencesInteractor: PreferencesInteractor): UserApiClient {
        val moshi = Moshi.Builder()
                .add(SkipBadElementsListAdapter.Factory)
             

        return Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .baseUrl(Interactors.apiEndpoint)
                .build()
                .create(UserApiClient::class.java)
    }

В основном мой вопрос таков:

Есть ли способ изменить эти классы, которые будут разрешить вызову API возвращать список объектов стикеров, которые имеют этот объект JSON в качестве атрибута, не прерывая другие вызовы API с использованием этого экземпляра Retrofit? Попытка позвонить теперь дает мне ошибку в заголовке:

 java.lang.IllegalArgumentException: Unable to create converter for class com.weare8.android.data.StickerDto

 Caused by: java.lang.IllegalArgumentException: Platform class java.util.LinkedHashMap in java.util.LinkedHashMap<java.lang.String, java.lang.Object> requires explicit JsonAdapter to be registered
...