JCa*_*los 21 android json converter retrofit2
我必须处理动态JSON响应.
之前,我正在使用类和注释如下:
public class ChatResponse {
@SerializedName("status")
private int status;
@SerializedName("error")
private String error;
@SerializedName("response")
private Talk response;
public int getStatus() {
return status;
}
public String getError() {
return error;
}
public Talk getResponse() {
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
当状态为1(成功)时,onResponse会触发,我可以获得ChatResponse对象.但是,当状态为0时,JSON表示中的响应为false,并且失败(onFailure被触发).
我想创建我的自定义转换器,这个问题有一个很好的例子,但该示例适用于Retrofit 1.
我必须创建一个扩展的类Converter.Factory,但我不知道如何覆盖此类的方法.
其实我有下一个:
@Override
public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
return super.fromResponseBody(type, annotations);
}
@Override
public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) {
return super.toRequestBody(type, annotations);
}
Run Code Online (Sandbox Code Playgroud)
我现在如何解析JSON响应呢?
提前致谢.
JCa*_*los 37
我正在寻找一个关于如何为Retrofit 2实现自定义转换器的简单示例,并没有发现任何好处(有一个例子,但至少对我来说,这对我的purpouse来说太复杂了).
但最后,我找到了解决方案.这个解决方案就是使用GSON deserializers.所以我们不需要自定义转换器,我们只需要自定义GSON converter.
这是一个很棒的教程.这是我的代码,用于解析我的问题中描述的JSON:
我发现@JCarlos解决方案是精确,快速和正确的。我需要在Android上实现Retrofit 2的自定义日期转换器。似乎您需要在GSonConverterFactory中注册一种新型的序列化器。实施以Kotlin lang 完成。
class RetrofitDateSerializer : JsonSerializer<Date> {
override fun serialize(srcDate: Date?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement? {
if (srcDate == null)
return null
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
val formatted = dateFormat.format(srcDate)
return JsonPrimitive(formatted)
}
}
Run Code Online (Sandbox Code Playgroud)
以及注册:
private fun buildGsonConverterFactory(): GsonConverterFactory {
val gsonBuilder = GsonBuilder()
// Custom DATE Converter for Retrofit
gsonBuilder.registerTypeAdapter(Date::class.java, RetrofitDateSerializer())
return GsonConverterFactory.create(gsonBuilder.create())
}
@Provides @Singleton
internal fun providesRetrofit(applicationContext: Context): Retrofit {
return Retrofit.Builder()
.baseUrl(GluApp.Static.BASE_REST_URL_ADDR)
.addConverterFactory(
buildGsonConverterFactory())
.build()
}
Run Code Online (Sandbox Code Playgroud)