如何Gson序列化扩展集合的对象?

时间:2014-12-16 14:34:12

标签: java gson

我有这个我要序列化的课程:

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}

1 个答案:

答案 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。