Retrofit處理json解析異常,Expected BEGIN_OBJECT but was String at line 1 column 1 path $

Retrofit檢驗json格式是否正確

怎么正確解析后臺給的數(shù)據(jù)

由于后臺接口可能返回各種各樣的數(shù)據(jù),接口也是千奇百怪,對http不太熟悉就很容易找不到方向,一會懷疑是地址拼接的不對,類型沒傳對,一會有感覺json 實體類寫的不對,我就簡單分享下,我這次是怎么跳出后臺挖的坑,成功解析的。

第一步,導入retrofit就不提了

第二步,觀察接口(廢話)

我得到接口就是這樣的

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()去掉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容