Retrofit不进行Json解析,直接返回String
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 获取字符串。