Gson解析String,com.google.gson.stream.MalformedJsonException

本文探讨了在使用OkHttp+Retrofit+Rx进行网络请求时,遇到的Gson解析异常问题,具体表现为com.google.gson.stream.MalformedJsonException。通过对问题的深入分析,找到了异常的根源在于toString方法的不当使用,并提供了两种解决方案:一是本地处理前进行数据预处理,二是调整服务器端返回数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个项目中,采用的是OkHttp+Retrofit+Rx写的,数据解析用的是Gson,最外层泛型

/**
 * Created by Zhu on 2018/8/9.
 * 返回的网络数据外层
 */

public class ObjResponse<Result> {
    public int rc;
    public String msg;
    public Result ret;
    public String err;
}

登录时候使用的类,比如说是UserData,那写法就是ObjResponse<UserData>,一般接口就是

Observable<ObjResponse<UserData>> login();

开始用的好好的,后台说要加session,登录后从头解析,我就把写法改成了

Observable<Response<ObjResponse>> login();

在获取到的data里

ObjResponse response = data.body;

if(response.rc == 0) {
    String result = response.rec.toString;
    Gson gson = new Gson;
    UserData userData = gson.fromJson(result, UserData.class);
    //将userData存入SharedPreference中
}

Gson转换数据那边包裹一个try-catch,catch里userData = null 登录先前的账户OK,没问题,可是隔两天测试跟我说登录后闪退,调试后发现,Gson转换不成功,异常:com.google.gson.stream.MalformedJsonException: Unexpected value at line 1 column 247 path $.phone

每个人碰到这个异常的情况不一样,有可能是类型写错的原因,我检查了下返回的数据和我的类型,发现没有出错,对比了下phone那个数据,后台返回的是 "phone": "",看着也没什么问题,那应该就是toString那里了,因为之前在一个老项目,一个接口返回的数据格式有五六种,之前的写法就是这样,拿到了数据toString,然后再用Gson解析成对应的实体,但是里面数据都是有的。在"phone": ""toString后会变成,{phone=,},导致解析失败。

解决办法:本地的话可以解析之前就做处理,或者直接转换成JsonObject

                  服务器的话,就和最开始一样,再把UserData加上就行了

Observable<Response<ObjResponse<UserData>>> login

data.body.rec就是UserData类型,不会出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值