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);
}
}