getActivity / GsonFactory

Gson 解析容错框架,愿从此再无 Json 解析报错
Apache License 2.0
667 stars 66 forks source link

打包成正式版解析有个BUG #13

Closed lzy0016 closed 2 years ago

lzy0016 commented 2 years ago

问题描述:同样的代码,在测试版一切正常,但是 打包成正式版之后 解析就出问题了。我用的技术中台的模板项目,把相关的网络请求代码加进去测试的 代码和测试结果如下 public class HttpList2Data extends HttpData<HttpList2Data.ListBean> {

public static class ListBean<T> {

    /** 当前页码 */
    private int pageIndex;
    /** 页大小 */
    private int pageSize;
    /** 总数量 */
    private int totalNumber;
    /** 数据 */
    private List<T> rows;

    public List<T> getRows() {
        return rows;
    }

    /**
     * 判断是否是最后一页
     */
    public boolean isLastPage() {
        return Math.ceil((float) totalNumber / pageSize) <= pageIndex;
    }

    public int getTotalNumber() {
        return totalNumber;
    }

    public int getPageIndex() {
        return pageIndex;
    }

    public int getPageSize() {
        return pageSize;
    }

    @Override
    public @NotNull String toString() {
        return "ListBean{" +
                "pageIndex=" + pageIndex +
                ", pageSize=" + pageSize +
                ", totalNumber=" + totalNumber +
                ", rows=" + rows +
                '}';
    }
}

} image 测试结果: 2021-10-29 11:11:23.587 18625-18773/com.hjq.demo I/EasyHttp:
{ "code" : "0", "data" : { "total" : 1, "rows" : [ { "address" : "", "air_north_time" : "", "condition" : "么有", "create_date" : 1635316395600, "create_user" : "admin", "direction" : "", "dynamic" : "3", "dynamic_img" : "/upload//fjkcjs/202110/fjkcjs_1635316393452.jpeg", "dynamic_time" : 1635316320609, "enterprise_id" : "fjkcjs", "id" : "02dbba90ebe848ccadabb1aed2b0b52f", "latitude" : "0.006", "longitude" : "0.0065", "now_port" : "", "remark" : "", "ship_date_id" : "b27ec0bdaf3c4c11a661af88a337fa2a", "ship_position" : "", "update_date" : "", "update_user" : "" } ] },"message" : "成功" } com.hjq.demo D/(:119): text==={"code":"0","data":{"total":1,"rows":[{"address":"","air_north_time":"","condition":"么有","create_date":1635316395600,"create_user":"admin","direction":"","dynamic":"3","dynamic_img":"/upload//fjkcjs/202110/fjkcjs_1635316393452.jpeg","dynamic_time":1635316320609,"enterprise_id":"fjkcjs","id":"02dbba90ebe848ccadabb1aed2b0b52f","latitude":"0.006","longitude":"0.0065","now_port":"","remark":"","ship_date_id":"b27ec0bdaf3c4c11a661af88a337fa2a","ship_position":"","update_date":"","update_user":""}]},"message":"成功"}

com.hjq.demo D/(:122): result===HttpData{code=0, msg='null', data=ListBean{pageIndex=0, pageSize=0, totalNumber=0, rows=[ShipDynamicListBean{air_north_time=null, create_date=null, create_user='null', condition='null', remark='null', direction='null', dynamic='null', dynamicName='null', dynamic_time=null, enterprise_id='null', id='null', now_port='null', ship_date_id='null', ship_position='null', update_date=null, update_user='null', dynamic_img='null'}]}}

从结果可以看出定位在这段代码
try { result = GsonFactory.getSingletonGson().fromJson(text, type); Timber.d("result===%s",result); } catch (JsonSyntaxException e) { // 返回结果读取异常 throw new DataException(mApplication.getString(R.string.http_data_explain_error), e); } 我最奇怪的是 debug版运行 我在这里打断点查看 一点问题都没有 但是一打包成正式的 就解析不出来了 而且还没报错 找这个bug找的我脑瓜子嗡嗡的 说的有点啰嗦了 希望大佬能看下

getActivity commented 2 years ago

小伙子,我提供以下几种解决方案给到你:

  1. GsonFactory.getSingletonGson() 替换成 new Gson() 看看会不会出现同样的问题

  2. 在 debug 模式下开启混淆看看是否出现这样的问题,如果会的话就是混淆的问题

  3. 通过查看异常抛出的堆栈,通过代码堆栈进行对问题定位,你需要先将代码这样改:

try {
    result = GsonFactory.getSingletonGson().fromJson(text, type);
} catch (JsonSyntaxException e) {
    e.printStackTrace();
    // 返回结果读取异常
    throw new DataException(mApplication.getString(R.string.http_data_explain_error), e);
}
lzy0016 commented 2 years ago

// 移除无用的资源 shrinkResources true // 代码混淆开关 minifyEnabled true 这个开启之后debug版也过不去了 然后将 GsonFactory.getSingletonGson() 替换成 new Gson()后就能看到报错了 com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String 后台返回数据不规范 将应该返回的Long型返回了个“” 人麻了 不过 用大佬的这个虽然没有崩溃但是就没异常抛出来了。。。

getActivity commented 2 years ago

OK 的,那这个就是你们后台的问题了