最新做的新项目里遇到接口返回类型不同一的情况没有按照默认格式返回,有点小头疼,这里自己写了个方法偷懒下
正常在开发的时候后台返回的json数据一般会遵从一定的格式返回,但也不排除会遇到一些数据没有格式的情况
正常格式的返回一般是这个样子
但是有的情况后台返回的是这个样子
也就是啥格式都没,时候该怎么办
因为retrofit是没有提供直接取出返回的json的,所以我们需要把 我们的请求返回的类型改成okhtttp的ResponseBody
列如:
Observable<ResponseBody> login( @Query("r_type") int tpye, @Query("username") String userId, @Query("password") String password );然后在返回的时候
String json = new String(responseBody.bytes());就可以拿到返回的JSON字符串了
然后我们使用GSON解析成我们自己需要的类就可以了
下面是自己写的一个类用来直接将返回的数据取出来转成相应的类
/** * Created by bcy on 2017/11/2.、 * 将接口ResponseBody数据转换成对应的Bean * 此方法主要是为了解决接口返回数据结构不统一问题 */ public class JSONTOBean { private static JSONTOBean Instance=null; public Object JSONTOBean(ResponseBody body, Class clazz){ Object obj=null; try { String json = new String(body.bytes()); Gson gson =new Gson(); obj=gson.fromJson(json,clazz); } catch (IOException e) { e.printStackTrace(); } return obj; } //单例模式 public static JSONTOBean getInstance() { if (Instance==null){ Instance=new JSONTOBean(); } return Instance; } }调用:
CallLoginBean call= (CallLoginBean)JSONTOBean.getInstance().JSONTOBean(response,CallLoginBean.class);CallLoginBean就用完整的返回JSON生成
将每个接口返回的数据单独生成一个callbean文件即可
如果是只有一个单独值,请直接拿json字符串操作
有什么问题还请各大网友指出...
11/3优化一下,有部分情况直接返回一个没有key的jsonarray会导致Gson解析异常
这里添加一个type类型解析可以完成解析
在JSONTOBean里添加一个type解析方法
public Object JSONTOBean(ResponseBody body, Type type){ Object obj=null; try { String json = new String(body.bytes()); Gson gson =new Gson(); obj=gson.fromJson(json,type); } catch (IOException e) { e.printStackTrace(); } return obj; }调用
Type listType = new TypeToken<List<CallDataAnalysisBean>>() {}.getType(); call= (List<CallDataAnalysisBean>) JSONTOBean.getInstance().JSONTOBean(response,listType);