我有一个类,其中包含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
对象中的列表也包含DataA
,DataB
和Data
个对象。
我该如何解决这个问题?
更新
所以我的程序就像这样工作:它会填充并填充Program
列表中的数据。比我保存它:我使用Gson
将Program
转换为json字符串。我使用Shared Preferences
。
比我再次打开应用程序时,它加载以前保存的json字符串。我Log.d
它,一切都很酷。
比
我想从那个json创建一个Program对象。
Gson gson = new Gson();
instance = gson.fromJson(savedJson, Program.class);
我用Gson
再次序列化之后发生了我上面写的内容。所以它似乎只从json创建BaseData
个对象。
答案 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);
}
}