用于Retrofit 2的定制转换器

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:


kos*_*cki 7

我发现@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)