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

Retrofit检验json格式是否正确

怎么正确解析后台给的数据

由于后台接口可能返回各种各样的数据,接口也是千奇百怪,对http不太熟悉就很容易找不到方向,一会怀疑是地址拼接的不对,类型没传对,一会有感觉json 实体类写的不对,我就简单分享下,我这次是怎么跳出后台挖的坑,成功解析的。

第一步,导入retrofit就不提了

第二步,观察接口(废话)

我得到接口就是这样的

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容