Gson无法反序列化多个类型列表

时间:2017-03-29 15:56:39

标签: java android serialization gson

我有一个类,其中包含ArrayList中的其他对象:

class Program {
    @Expose
    private List<BaseData> dataList;
}

我还有其他课程:

class BaseData {
    @Expose
    String name;
}

class Data extends BaseData {
    @Expose
    String description;
}

class DataA extends Data{
    @Expose
    String a;
}

class DataB extends Data{
    @Expose
    String b;
}

当我想序列化时:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Log.d(TAG, gson.toJson(myProgram));

我只能看到BaseData中的密钥。我的Program对象中的列表也包含DataADataBData个对象。

我该如何解决这个问题?

更新

所以我的程序就像这样工作:它会填充并填充Program列表中的数据。比我保存它:我使用GsonProgram转换为json字符串。我使用Shared Preferences。 比我再次打开应用程序时,它加载以前保存的json字符串。我Log.d它,一切都很酷。

我想从那个json创建一个Program对象。

Gson gson = new Gson();
instance = gson.fromJson(savedJson, Program.class);

我用Gson再次序列化之后发生了我上面写的内容。所以它似乎只从json创建BaseData个对象。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案

顺便说一下。这感觉就像是一阵蛮力&#34;方法

Gson gson = new Gson();
JSONObject progJsonObj = new JSONObject(json);
progJsonObj.clearDataList();
JSONArray dataList= reader.getJSONArray("dataList");
Program program = gson.fromJson(progJsonObj.toString());
for (int i = 0; i < dataList.length(); i++) {
    JSONObject blockData = blocksInProgram.getJSONObject(i);
    // Added new class variable of the base class
    String type = blockData.getString("dataType");
    if (type.equals("data_a")) {
        DataA d = gson.fromJson(blockData.toString(), DataA.class);
        program.addData(d);
    } else if (type.equals("data_b")){
        DataB d = gson.fromJson(blockData.toString(), DataB.class);
        program.addData(d);
    }
}