Retrofit檢驗json格式是否正確
怎么正確解析后臺給的數(shù)據(jù)
由于后臺接口可能返回各種各樣的數(shù)據(jù),接口也是千奇百怪,對http不太熟悉就很容易找不到方向,一會懷疑是地址拼接的不對,類型沒傳對,一會有感覺json 實體類寫的不對,我就簡單分享下,我這次是怎么跳出后臺挖的坑,成功解析的。
我得到接口就是這樣的
ws.ashx?m=mob.TrackGetPage.>1>&user=&date=2019/9/10&total=&pageindex=10&pagesize=0
>1>是一個動態(tài)的密碼
后面兩個參數(shù)是分頁查詢的兩個參數(shù)
這個難點主要就是在日期的格式,和total這個參數(shù)要返回空值(我最開始就摔在這了)
先創(chuàng)建接口
由于m=…后面是固定值加上動態(tài)的參數(shù),所以我是在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);
獲取選擇的日期,轉(zhuǎn)換成需要的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中轉(zhuǎn)義字符有很多,具體可以查看一下,這里我們需要的就是"%2B"
調(diào)用之前寫好的retrofit接口
Call<DownPoint>call=api.downloadPoint("方法名"+passcode,u1,format,"%2B",10,0)
DownPoint是用GsonFormat自動生成的bean。
如果第一次沒有成功,換成ResponseBody試一下
(200不代表你接收的數(shù)據(jù)沒問題,因為你也不知道后臺在處理異常時會給你返回個什么類型的信息,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()去掉