У меня есть объект, который передается из API с другим json объектом (без именованных атрибутов) в качестве одного из его атрибутов:
"stickerData": {}
Я бы хотел, чтобы это было проанализировано в этом объекте :
@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: String,
)
Архитектура этого приложения использует один экземпляр Retrofit для каждого вызова API:
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)
}
Который использует этот адаптер, который вы можете видеть прикрепленным выше:
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
}
}
Однако этот адаптер не позволяет анализировать объект JSON как строку. Если я попытаюсь, выдаст ошибку
Gson: Expected a string but was BEGIN_OBJECT
. Есть ли способ заставить этот адаптер анализировать такие атрибуты как необработанные строки, а не искать объект?