对于生成的APK和调试模式,Gson的行为不同

时间:2018-10-30 20:32:37

标签: android json gson

我尝试解析从通知包中获取的数据:

String intervalsData = data.getString(ARG_INTERVAL, "[]");
Type intervalListType = new TypeToken<List<Interval>>() {}.getType();
List<Interval> intervalList = ConnectionUtils.dataFromString(intervalsData, intervalListType);

以下是数据示例:

"[{
  \"StartDateTime\": \"0001-01-01T00:00:00\",
  \"EndDateTime\": \"0001-01-01T00:00:00\",
  \"Interval\": \"100000.0\"
}]"

dataFromString方法:

public static <T> T dataFromString(String json, Type type) {
        Gson gson = new GsonBuilder()
                .setDateFormat(Common.DateFormatKinds.ServerDateFormat.getValue())
                .create();
        return gson.fromJson(json, type);
    }

服务器日期格式为"yyyy-MM-dd'T'HH:mm:ss"

间隔等级:

import java.util.Date;

public class Interval{
    public Date StartDateTime;
    public Date EndDateTime;
    public double Interval;
}

当我将应用程序从android studio上传到设备时,一切正常。 但是,当我生成apk并通过hockeyapp上传时,Gson可以正确解析数组,但是Interval项中的字段为空。

2 个答案:

答案 0 :(得分:2)

您需要为@Keep类添加Interval注释,因为Proguard会混淆已签名apk中的所有类,并且Gson无法将JSON解析为您的模型。

import java.util.Date;
import android.support.annotation.Keep;

@Keep
public class Interval{
    public Date StartDateTime;
    public Date EndDateTime;
    public double Interval;
}

答案 1 :(得分:2)

将其添加到ProGuard配置规则中,以保留类名称及其公共字段:

Timedata.map( (obj) => {
    ...
})

使用-keep class com.acme.Interval { public <fields>; } 批注在代码级别进行处理;两种方法都有效。