Я хочу проанализировать несколько типов ответов для API. API может предоставить массив объектов User или один объект Json совершенно другого типа. Я использую моши для конвертерной фабрики с модернизацией. Используя moshi, я получаю ArrayList из LinkedHashMapTree, когда API дает JsonArray в ответ, и LinkedHashMapTree в другом случае, который является правильным. Я хочу преобразовать объекты LinkedHashMapTree в ArrayList в тип пользователя ArrayList и в другом случае преобразовать LinkedHashMapTree в соответствующий объект.
Настройка дооснащения:
@Provides
@Singleton
fun provideMoshi(): Moshi {
return Moshi.Builder()
.build()
}
@Provides
@Singleton
fun provideRetrofit(client: OkHttpClient, moshi: Moshi, apiConfig: ApiConfig): Retrofit {
return Retrofit.Builder()
.baseUrl(apiConfig.baseUrl)
.client(client)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
}
API:
@Headers("No-Authorization: true")
@POST("mobileotp/confirmOtp")
fun confirmOTP(@Body confirmOTPBody: ConfirmOTPBody): Single<Any>
Использование:
mobileOtp.value?.let {
val request = frappRepository.confirmOtp(ConfirmOTPBody(it.mobile, otp))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe {}
.subscribe({ data, error ->
data?.let {
Log.i("CHECKING TYPE", it.javaClass.name)
val arrayType = data as? ArrayList<Any>
Log.i("CHECKING INTERNAL TYPE", arrayType!![0].javaClass.name)
// if (it.("[")) {
// val adapter = moshi.adapter<Array<User>?>(Array<User?>::class.java)
// usersOrUser.value = adapter.fromJson(it)
// } else {
// val adapter = moshi.adapter<UserTokens?>(UserTokens::class.java)
// usersOrUser.value = adapter.fromJson(it)
// }
}
error?.let {
}
})
compositeDisposable?.add(request)
}