Java Gson can';t反序列化多类型列表

Java Gson can';t反序列化多类型列表,java,android,serialization,gson,Java,Android,Serialization,Gson,我有一个类,它在ArrayList中保存其他对象: class Program { @Expose private List<BaseData> dataList; } 当我想序列化它时: Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); Log.d(TAG, gson.toJson(myProgram)); 我只能看到我在BaseData中拥有的密钥。我的

我有一个类,它在
ArrayList
中保存其他对象:

class Program {
    @Expose
    private List<BaseData> dataList;
}
当我想序列化它时:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Log.d(TAG, gson.toJson(myProgram));
我只能看到我在
BaseData
中拥有的密钥。我的
程序
对象中的列表也包含
DataA
DataB
数据
对象

我怎样才能解决这个问题

更新:

所以我的程序是这样工作的:它会填充
程序
的列表中的数据。然后我保存它:我使用
Gson
程序
转换为json字符串。我使用
共享首选项
。 当我再次打开应用程序时,它会加载以前保存的json字符串。我
Log.d
it,一切都很酷

我想从这个json创建一个程序对象

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

在我用Gson再次序列化它之后,就会发生我上面写的事情。因此,它似乎只从json创建
BaseData
对象。

我找到了解决方案

顺便说一句,这感觉有点像“蛮力”的方法

Gson-Gson=new-Gson();
JSONObject progJSONObject=新的JSONObject(json);
progJsonObj.clearDataList();
JSONArray dataList=reader.getJSONArray(“dataList”);
Program=gson.fromJson(progJsonObj.toString());
对于(int i=0;i
我打赌您没有初始化
数据.description
数据a.a
数据b.b
并且所有这些都是
空的
。它必须至少对Gson 2.8.0起作用。您下注输了。它们不是空的,我已经检查过了。你能提供初始化代码和你正在使用的Gson版本吗
gson.toJson(新程序(asList(newdataa(“foo”,“bar”,“baz”),newdatab(“foo”,“bar”,“baz”))))
生成以下JSON:
{“dataList”:[{“a”:“baz”,“description”:“bar”,“name”:“foo”},{“b”:“baz”,“description”:“bar”,“name”:“foo”}]}
另外,尝试添加
serializes()
添加到
GsonBuilder
实例中,以确保结果JSON的真实情况。我尝试添加
serializeNulls()
但没有任何变化您正在解决一个微不足道的反序列化问题,Gson还有一个额外的用途:看看——看看javadocs如何为您解析数据类型。此外,请注意,
JSONObject
JSONArray
来自
org.json
,在其他情况下可能无法与Gson一起使用(您可能会与Gson提供的
JSONObject
JSONArray
相混淆)。@lyubmyrshaydariv谢谢!我找到了那门课,但是太晚了。。。再次感谢你的帮助!
Gson gson = new Gson();
instance = gson.fromJson(savedJson, Program.class);
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);
    }
}