Retrofit2标量转换器在gson转换器android之前不转换

Posted

技术标签:

【中文标题】Retrofit2标量转换器在gson转换器android之前不转换【英文标题】:Retrofit2 scalar converter not converting before gson converter android 【发布时间】:2017-01-07 20:11:10 【问题描述】:

我在 android 中有以下改造 2,首先是标量转换器工厂,然后是 gson 转换器,但是当我调用字符串调用并且响应以字符串形式出现时,它给了我例外“不是 JSON 对象:”成功“。

我错过了什么吗?

改造创作:

Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(IPService.END)
                .client(new OkHttpClient.Builder().build())
                .build();

调用创建:

@POST("/friends/sendRequest")
Call<String> sendFriendRequest(...);

调用执行:

Response<String> a =  myApi.sendFriendRequest(...).execute();

响应正文为“成功”。

【问题讨论】:

需要有一些jsonkey,比如响应应该是"responsemessage":"Success"。这就是它抛出异常的原因 您可以将回复原样发布在日志中或邮递员上吗? 【参考方案1】:

我认为使用 Gson 和 Scalar 是不可能的。 Retrofit 无法识别它是纯字符串响应还是 json 字符串响应。

我的方法是只使用Scalar转换器,到处返回String,然后使用Gson在流中手动转换。

以下在 Kotlin 中使用 RxJava 的示例

@GET("path")
    fun getVersion(@Path("path") hash: String): Single<String>

api.getVersion()
                .map  val gson =  GsonBuilder()
                        .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
                        .create()
                        gson.fromJson(it, VersionResponse::class.java)
                

【讨论】:

【参考方案2】:

我认为这是因为 Scalar 不能与 Call 包装一起使用

【讨论】:

以上是关于Retrofit2标量转换器在gson转换器android之前不转换的主要内容,如果未能解决你的问题,请参考以下文章

改造:来自 gson 转换体的原始响应体

使用 Retrofit2 和 OkHttp3 在 API 获取请求后将 XML 布局转换为 Jetpack Compose

无法在 Retrofit 2.0 android 中获取 json 字符串作为响应

如何在对象 Gson/Retrofit2 中获取字符串

你能避免 Gson 将“<”和“>”转换为 unicode 转义序列吗?

如何使用Retrofit2,RxJava2,Gson TypeAdapterFActory正确映射Gson?