改进-@Query无法与JSON响应映射(java.lang.UnsupportedOperationException:JsonObject)

时间:2019-12-04 19:39:29

标签: android kotlin retrofit retrofit2

最后,我已经找到了根本原因。

我试图在新计算机上运行我的项目,但是我得到了一个新的异常,可以清楚地了解发生了什么。

新的例外是

java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 2601 path

所以,我只是正确地修复了模型类(将字符串数据类型设置为列表) 一切正常。

我不确定为什么异常细节是两台计算机之间的差异。

在第一台计算机上尝试时,通常可以像使用portfolio/getPortFolio?idCard=1234567890&customerGroup=I一样使用@Paht和Full url这两种方法

但是在新计算机中,所有方法都具有相同的例外。


我正在尝试使用Retrofit来通过多个URL参数发出@Get请求。 因此,我从@Path更改为@Query,但没有任何反应

我有这个例外

"java.lang.UnsupportedOperationException: JsonObject"

当我使用

@GET("portfolio/getPortFolio?idCard=1234567890&customerGroup=I")
    fun getPortfolio()
            : Call<PortfolioResponse>
}

@GET("portfolio/getPortFolio/{idCard}")
    fun getPortfolio(@Path("idCard") idCard : String)
            : Call<PortfolioResponse>
}

我通常都可以得到PortfolioResponse

但是,如果我将URL参数与@Query一起使用,则会出现异常:(

    @GET("portfolio/getPortFolio")
            fun getPortfolio(
                @Query("idCard") idCard: String,
                @Query("customerGroup") customerGroup: String
            )
                    : Call<PortfolioResponse>

我的依赖  // retrofit&okhttp

  • 实施'com.squareup.retrofit2:retrofit:2.6.1'
  • 实现'com.squareup.retrofit2:converter-gson:2.6.1'
  • 实施'com.google.code.gson:gson:2.8.5'
  • 实现'com.squareup.okhttp3:logging-interceptor:3.11.0'
  • 实现'com.squareup.okhttp3:okhttp-urlconnection:3.8.1'

用法

ApiHelper.create().getPortfolio(currentID, customerGroup)
            .enqueue(object : Callback<PortfolioResponse> {
                override fun onFailure(call: Call<PortfolioResponse>, t: Throwable) {
                    Logger.e("babore", t.localizedMessage)
                }

                override fun onResponse(
                    call: Call<PortfolioResponse>,
                    response: Response<PortfolioResponse>
                ) {
                    viewModel.portfolioLiveData.value = response.body()
                }

            })
 fun create(): AppServices {

            val gson = GsonBuilder()
                .registerTypeAdapter(String::class.java, StringDeserializer())
                .create()

            val retrofit = Retrofit.Builder()
                .addConverterFactory(
                    GsonConverterFactory.create(gson)
                )
                .baseUrl(BuildConfig.ENDPOINT_URL)
                .client(setupOkhttpInterceptor())
                .build()

            return retrofit.create(AppServices::class.java)
        }

0 个答案:

没有答案