Gson非法状态异常:需要一个整型值,但在第1行第Y列却是开始_ARRAY

myss37ts  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(424)

由于我已经向Schedule类添加了一个整数,因此Gson在某些设备上抛出了一个错误:java.lang.IllegalStateException: Expected an int but was BEGIN_ARRAY at line 1 column Y(例如,列112或120等)。我查看了thisthis的答案,这似乎表明Gson期望的是一个int,但得到的是一个开始_ARRAY字符,但我 * 不 * 知道为什么在向类中添加额外的int的重构后会发生这种情况。
在此之前,我从存储的Json字符串解析Schedule对象列表的代码工作得非常好。我添加了Since annotation,因为抛出了异常。下面是Schedule类:

public class Schedule {

    /**
     * Added this variable 
     */
    @Since(1.1) private int addedVar;

    /**
     * All other variables have the @Since(1.0) annotation
     */
    @Since(1.0) all other vars;

}

用于分析计划的函数:

public static ArrayList<Schedule> schedulesFromJson(String schedulesJson) {
    Type listType = new TypeToken<ArrayList<Schedule>>(){}.getType();
    Gson gson = new Gson();
    try {
        return gson.fromJson(schedulesJson, listType);
    } catch (Exception exception) {
        // Try to use the previous version of the schedule, because of IllegalStateException
        gson = new GsonBuilder().setVersion(1.0).create();
        return gson.fromJson(schedulesJson, listType);
    }
}

奇怪的是:在一些设备上(比如我自己的测试设备),这个崩溃从来没有发生过。2因为这个崩溃,我添加了带有try和catch子句的Since注解,因为我预计它可能与添加的额外整数有关,并且可以通过简单地阅读旧的Schedule版本来防止它,但是这仍然在catch子句中抛出了相同的异常。
有什么能解释的吗?

jutyujz0

jutyujz01#

想通了:因为没有将Profuard设置为 not 对Schedule对象进行模糊处理(感谢@Marcono1234给我提供了正确的指导),所以Schedule对象作为一个模糊对象({"a":true,"b":"Name","c":[true,true,true,true,true,false,false], etc})存储在存储中,而不是使用变量名。
根据添加addedVar之前的Schedule类结构,调度中存在数组,因此引发了异常。示例更简单。
旧的调度类:

public class Schedule {
    private boolean isActive;
    private String scheduleName;
    private boolean[] days;
    private final long timeCreated;
    private ArrayList<String> list;
}

新的计划类:

public class Schedule {
    private boolean isActive;
    private String scheduleName;
    private boolean[] days;
    private final long timeCreated;
    private int addedVar; // <-- Here it goes wrong
    private ArrayList<String> list;
}

因为在ArrayList<String> list之前添加了int变量,所以当Gson尝试反序列化存储的JSON字符串时,它预期看到的是int(addedVar,但实际上从列表中看到的是开始_ARRAY。
我通过在Schedule类中的列表之后放置'addedVar'来修复它,这样Since(1.0)注解就可以正常工作了。

相关问题