使用Gson.fromJson()进行反序列化不会忽略缺少的字段

时间:2019-03-21 11:21:13

标签: java android json parsing gson

只有在向此类添加新属性后,崩溃才会重现。

public class FormDataModel {
    private String name;
    private String description;
    private int dbid;
    private String localStorageId;
    private boolean isEnabled = true;
    private boolean isDirty;
    private boolean needsUpdate;
    private boolean needsUpload;
    private FormLocation formLocation;
    private String modifiedDate;
    private String displayedId;
    private String version;
    private boolean syncWithWebservice = false;
    private List<WebserviceCallModel> calls = new ArrayList<>();
}

在当前版本中,我向正在序列化的类添加了一个新属性(名为“ 调用”)。我保留了存储在SharedPreferences中的FormDataModel列表,序列化为字符串。

打开应用程序时,序列化和混淆的列表为:

{"a":"Form Port","b":"Form description","c":482,"d":"775c5a8a-93fc-4257-805d-447bb1da27e2","e":true,"f":false,"g":false,"h":false,"i":3,"j":"2019-03-05T09:21:21","k":"045","l":"001","m":true}]

我一直收到的错误是:   java.lang.IllegalStateException:应为BEGIN_ARRAY,但在第1行第193列路径$ [0] .m中为BOOLEAN

据我所知,变量'syncWithWebservice'被混淆为'm'。我似乎无法理解为什么Gson期望一个数组而不是一个布尔变量。我重复一遍,只有在将“ calls”属性添加到类之后,才发生崩溃。

我只想解析列表,如果没有找到,则使用空列表来初始化调用列表。

反序列化代码:

   Gson gson = new GsonBuilder().setPrettyPrinting().create();
   ArrayList<FormDataModel> formList = gson.fromJson(set, new TypeToken<List<FormDataModel>>() {}.getType());

其中“ set”变量是保存在SharedPrefs中的内存中序列化列表。

关于SO的所有其他通用解析问题均无济于事,因为列表的结构格式有效,并且在添加新属性之前已被序列化和反序列化。

谢谢。

0 个答案:

没有答案