美文网首页androidAndroid开发android框架学习
Retrofit不进行Json解析,直接返回String

Retrofit不进行Json解析,直接返回String

作者: d26168ad953a | 来源:发表于2016-10-09 17:06 被阅读10377次

    Android app开发 网络请求是到处可见
    在网上看到很多框架,如:xUtils、volley、retrofit
    现在很多文章讲述了 RxJava + Retrofit2.0 + MVP模式的整合
    使用Retrofit网络请求,返回的都是对象,String是属于基本类型。

    以下是Retrofit1.9相关设置 (Retrofit2.0设置有一点点不同,把“set”去掉或换成“add”就差不多了)


    【RestClient.java】.png 【RestService.java】.png 【MainActivity.java】.png

    正确的返回字符串:{"code":0,"msg":"","app":0,"info":"","url":""}

    尝试1:

    用CallBack<String>会报com.google.gson.JsonSyntaxException异常错误(是Gson的)
    好像不能 返回字符串?

    尝试2:

    然后CallBack<Object> 返回object.toString={code:0,msg:,app:0,info:,url:}
    得到的字符串没有了双引号。
    (Gson解析异常com.google.gson.stream.MalformedJsonException)
    很纠结!

    尝试3:

    CallBack<JSONObject> 返回object.toString={},也不对。【注意:】

    【org.json.JSONObject】.png

    尝试4:

    CallBack<JsonObject> 返回object.toString={ "code":0, "msg":"", "app":0, "info":"", "url":"" }。
    【注意:不要混淆JSONObject 如上图,JsonObject如下图】


    【com.google.gson.JsonObject】.png

    总结:

    retrofit 可以得到String字符串的,要注意区分 JsonObject 和 JSONObject!

    集体的智慧N

    当时写这个原因是因为要用到返回的一个非正常的json数据,然而同事用volley,这样 就有多个网络请求框架,对整个app影响显而易见。
    看到评论可以用 okhttp3.ResponseBody 类(public abstract class ResponseBody implements Closeable 是一个抽象类) ,测试一下可行。不过大家注意一下要捕获IO异常(IOException).

    @Override
    public void onNext(ResponseBody response) { 
        try {
            String result = response.string().trim();
            Log.e("ResponseBody", ",\tresult=" + result);
            if (!TextUtils.isEmpty(result)) { 
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
    

    或者 okhttp3.Response类(public final class Response implements Closeable,注意 final修饰的类是无法有子类)

    @Override
    public void onNext(Response response) { 
        if(response.isSuccessful()){
            try {
                // response.body() 返回 ResponseBody
                String result = response.body().string().trim();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    还有很多方式:如写一个类继承Response或者ResponseBody,处理掉异常。
    欢迎评论。
    个人推荐使用 Response 获取字符串。

    相关文章

      网友评论

        本文标题:Retrofit不进行Json解析,直接返回String

        本文链接:https://www.haomeiwen.com/subject/qegpyttx.html