Retrofit检验json格式是否正确
怎么正确解析后台给的数据
由于后台接口可能返回各种各样的数据,接口也是千奇百怪,对http不太熟悉就很容易找不到方向,一会怀疑是地址拼接的不对,类型没传对,一会有感觉json 实体类写的不对,我就简单分享下,我这次是怎么跳出后台挖的坑,成功解析的。
我得到接口就是这样的
ws.ashx?m=mob.TrackGetPage.>1>&user=&date=2019/9/10&total=&pageindex=10&pagesize=0
>1>是一个动态的密码
后面两个参数是分页查询的两个参数
这个难点主要就是在日期的格式,和total这个参数要返回空值(我最开始就摔在这了)
先创建接口
由于m=…后面是固定值加上动态的参数,所以我是在Call()的时候拼接上的,如果有更好的方法告诉我一下。
@POST("ws.ashx")
Call<DownPoint> downloadPoint(
@Query("m") String method,
@Query("user") String user,
@Query("date") String date,
@Nullable @Query("total") String total,
@Query("pageindex") int pageindex,
@Query("pagesize") int pagesize
);
我的页面是在DatePickerDialog中的,所以日期的获取就是
Calendar calendar = Calendar.getInstance ();
Int year = calendar.get (Calendar.YEAR);
Int month = calendar.get (Calendar.MONTH);
Int day = calendar.get (Calendar.DAY_OF_MONTH);
获取选择的日期,转换成需要的String类型的date.
DatePickerDialog.OnDateSetListener dateSetListener=newDatePickerDialog.OnDateSetListener(){@OverridepublicvoidonDateSet(DatePicker view,intyear,intmonth,intdayOfMonth){Calendar c=Calendar.getInstance();c.set(year,month,dayOfMonth);String format=String.format("%tY/%tm/%td",c,c,c);
"total="
如果传null就错误了,在http中转义字符有很多,具体可以查看一下,这里我们需要的就是"%2B"
调用之前写好的retrofit接口
Call<DownPoint>call=api.downloadPoint("方法名"+passcode,u1,format,"%2B",10,0)
DownPoint是用GsonFormat自动生成的bean。
如果第一次没有成功,换成ResponseBody试一下
(200不代表你接收的数据没问题,因为你也不知道后台在处理异常时会给你返回个什么类型的信息,String可能比较多)
有可能异常是 Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 4171
或者是 Expected BEGIN_OBJECT but was String at line 1 column 1 path $ 这种就是gson解析时,你用object类型接收,对面返回了String类型,用ResponseBody,你就可以点进去看一下返回的到底是什么鬼
call.enqueue(newCallback<ResponseBody>(){@OverridepublicvoidonResponse(@NullableCall<ResponseBody>call,Response<ResponseBody>response){if(response.isSuccessful()){Log.e(TAG,"onResponse: "+response);

打印的log成功应该是这样,点击下划线处就能看到返回的实例了
如果想直接打印返回的json
try{String string=response.body().string();}catch(IOExceptione1){e1.printStackTrace();}Log.e(TAG,"onResponse: "+string);
String string = response.body ().string (); 写成toString是获取不到的
json 中值有空格是没有问题的,不会妨碍解析的。如果是头尾有空格,可以用string.trim()去掉