Модифицируйте множественный тип ответа Массив или Объект - PullRequest
0 голосов
/ 31 августа 2018

Я хочу проанализировать несколько типов ответов для 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)
    }
...