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

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

由于我已经向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类:

  1. public class Schedule {
  2. /**
  3. * Added this variable
  4. */
  5. @Since(1.1) private int addedVar;
  6. /**
  7. * All other variables have the @Since(1.0) annotation
  8. */
  9. @Since(1.0) all other vars;
  10. }

用于分析计划的函数:

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

奇怪的是:在一些设备上(比如我自己的测试设备),这个崩溃从来没有发生过。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类结构,调度中存在数组,因此引发了异常。示例更简单。
旧的调度类:

  1. public class Schedule {
  2. private boolean isActive;
  3. private String scheduleName;
  4. private boolean[] days;
  5. private final long timeCreated;
  6. private ArrayList<String> list;
  7. }

新的计划类:

  1. public class Schedule {
  2. private boolean isActive;
  3. private String scheduleName;
  4. private boolean[] days;
  5. private final long timeCreated;
  6. private int addedVar; // <-- Here it goes wrong
  7. private ArrayList<String> list;
  8. }

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

展开查看全部

相关问题