我有这个我要序列化的课程:
class EnrichedList extends ArrayList<String> {
long timestamp = System.currentTimeMillis();
}
开箱即用的Gson
序列化程序会忽略时间戳字段,因为它在集合类中。我知道我可以写一个TypeAdapter并手动处理这个类,它可能是我的解决方案,但我想探索我的选择。有没有更好的选择可以更好地扩展和维护?想想新开发人员进入团队并向EnrichedClass
添加字段/属性而不知道他必须同时更新TypeAdapter的情况。
我的问题的证据:
class EnrichedList extends ArrayList<String> {
long timestamp = System.currentTimeMillis();
}
class SimpleObject {
long timestamp = System.currentTimeMillis();
}
@Test
public void serializeIt() {
EnrichedList list = new EnrichedList();
list.add("Fred");
list.add("Flintstone");
System.out.println("Enriched list: " + new Gson().toJson(list));
System.out.println("Simple object: " + new Gson().toJson(new SimpleObject()));
}
生成此输出:
Enriched list: ["Fred","Flintstone"]
Simple object: {"timestamp":1418739904470}
期望的输出(示例):
Enriched list: {"timestamp":1418739904470, "list": ["Fred","Flintstone"]}
Simple object: {"timestamp":1418739904470}
答案 0 :(得分:2)
所以给你的编辑,修正后的JSON为
{"timestamp":1418739904470, "list": ["Fred","Flintstone"]}
你必须问自己密钥list
的来源。如果您的收藏是Set
怎么办?怎么样呢? Gson没有这样的默认值。
在我看来,最合适的解决方案是使用构图而不是继承(显然,只有在可能的情况下)。
class EnrichedList {
long timestamp = System.currentTimeMillis();
ArrayList<String> list = new ArrayList<String>();
}
Gson可以顺利地将其序列化为您想要的JSON。