Android 使用Retrofit获取JSON数据

Posted 星辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 使用Retrofit获取JSON数据相关的知识,希望对你有一定的参考价值。

        在大家使用网络请求的时候,往往会出现一种情况:需要拿到服务器返回来的JSON字符串,而Retrofit会默认将Json解析,而又没有直接暴露出拿到Json字符串的方法;

      今天测接口的时候,发现当数据正常时,服务器会返回{"code":200,"datas":"1"},当请求参数有错误时,会返回{"code":400,"datas":{"error":"\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a"}},datas里一会儿是字符串,一会儿是对象,这时就不能用JAVABEAN的形式接收返回数据了。

示例:

//删除地址
@FormUrlEncoded
@POST(ServiceAddr.ADDR_DEL_URL)
Observable<ResponseBody> delAddr(@FieldMap HashMap<String,String> map);
//删除地址
@FormUrlEncoded
@POST(ServiceAddr.ADDR_DEL_URL)
Call<ResponseBody> delAddr2(@FieldMap HashMap<String,String> map);
Presenter层:
public void delAddr(String baseUrl,HashMap<String,String> map){
    addrManageModel.delAddr(baseUrl, map)
            .subscribe(new Subscriber<ResponseBody>() {
                @Override
                public void onCompleted() {
                    Logger.t(TAG).d("地址删除成功");
                }

                @Override
                public void onError(Throwable e) {
                    Logger.t(TAG).d("地址删除失败"+e.getMessage());
                }

                @Override
                public void onNext(ResponseBody responseBody) {
                    BufferedSource source = responseBody.source();
                    try {
                        source.request(Long.MAX_VALUE); // Buffer the entire body.
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    Buffer buffer = source.buffer();

                    Charset charset = UTF8;
                    MediaType contentType = responseBody.contentType();
                    if(contentType != null){
                        charset = contentType.charset(UTF8);
                        //获取Response的body的字符串 并打印
                        Logger.t(TAG).d(buffer.clone().readString(charset));
                        addrManageView.delAddrShow(buffer.clone().readString(charset));
                    }
                }
            });
}
或者
public void delAddr2(String baseUrl,HashMap<String,String> map){
    addrManageModel.delAddr2(baseUrl, map).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
            Logger.t(TAG).d(response.body().toString()+"===="+response.message()+"==="+response.code());
            BufferedSource source = response.body().source();
            try {
                source.request(Long.MAX_VALUE); // Buffer the entire body.
            } catch (IOException e) {
                e.printStackTrace();
            }
            Buffer buffer = source.buffer();

            Charset charset = UTF8;
            MediaType contentType = response.body().contentType();
            if(contentType != null){
                charset = contentType.charset(UTF8);
                //获取Response的body的字符串 并打印
                Logger.t(TAG).d(buffer.clone().readString(charset));
                addrManageView.delAddrShow(buffer.clone().readString(charset));
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

        }
    });
}
在页面上调用:
delAddrShow()更新UI即可。

 





以上是关于Android 使用Retrofit获取JSON数据的主要内容,如果未能解决你的问题,请参考以下文章

Android - 获取错误“无法使用Retrofit构建实例(尽管至少存在一个创建)”

如何使用 Retrofit 解析 json

我得到了预期的BEGIN_ARRAY,但是在使用Android中的Retrofit(java)尝试获取json时,在第1行第2列路径$中是BEGIN_OBJECT

如何将 AsyncTask 转换为 Retrofit 以从 Android 中的 WCF Webservice 获取数据

使用 Retrofit 获取 JSON

Android Retrofit 请求字符串(非JSON数据)