Android Retrofit 2.0自定义JSONObject Converter

Posted 一叶飘舟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Retrofit 2.0自定义JSONObject Converter相关的知识,希望对你有一定的参考价值。

如果在使用的过程中,不需要Gson以及其他转换器,只是单纯的返回 JSONObject,那这样怎么处理呢?

通过阅读源码发现,可以通过自定义转换器的方式操作:

import retrofit.Call
/*Retrofit 2.0*/

public interfase ApiService{
    @POST("/list")
    Call<JSONObject> loadRepo();
}

同步操作:

Call<JSONObject> call = service.loadRepo();
Repo repo = call.excute()

异步操作:

Call<JSONObject> call = service.loadRepo();
call.enqueue(new Callback<JSONObject>(){
    @Override
    public void onResponse(Response<JSONObject> response){
        //从response.body()中获取结果
    }
    @Override
    public void onFailure(Throwable t){

    }
});

这样就完了么?不。

  • 添加自定义Converter

地址:https://github.com/brokge/Retrofit2.0-JSONCoverter
选择相应版本添加到项目中。(Retrofit 2.0 -beta2和Retrofit 2.0-beta4 处理方式不同)

  • GsonConverterFactory.create(gson)换成 JsonConverterFactory.create()

关键代码:

public class JsonConverterFactory extends Converter.Factory {

    public static JsonConverterFactory create() {
        return new JsonConverterFactory ();
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        return new JsonResponseBodyConverter<JSONObject>();
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        return new JsonRequestBodyConverter<JSONObject>();
    }


}


final class JsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {

    JsonResponseBodyConverter() {

    }

    @Override
    public T convert(ResponseBody value) throws IOException {
        JSONObject jsonObj;
        try {
            jsonObj = new JSONObject(value.string());
            return (T) jsonObj;
        } catch(JSONException e) {
            return null;
        }
    }
}

完整代码如下:

private static Retrofit initRetrofit() {
        OkHttpClient httpClient = new OkHttpClient();
        if (BuildConfig.DEBUG) {
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            httpClient = new OkHttpClient.Builder().addInterceptor(logging).build();
        }
        return new Retrofit.Builder()
                .baseUrl(BaseUtil.getApiUrl())
                .addConverterFactory(JsonConverterFactory.create())
                .client(httpClient)
                .build();
    }

或许下面文章你也感兴趣:
Android Retrofit 请求字符串(非JSON数据)

Retrofit 自定义Converter

以上是关于Android Retrofit 2.0自定义JSONObject Converter的主要内容,如果未能解决你的问题,请参考以下文章

如何使用拦截器在 Retrofit 2.0 中添加标头?

Retrofit-2.0 - 解析在 xml 中包含 json 的响应

Android Retrofit 2.0 刷新令牌

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

Android Retrofit 2.0 的详细 使用攻略(含实例讲解)

Android Retrofit 2.0 的详细 使用攻略(含实例讲解)