如何使用GSON指定序列化?

时间:2012-04-18 01:23:51

标签: java android json gson

编辑:解决了,当SO让我时,会标记我的答案:)

我正在使用greenDAO来生成一堆类,当我尝试让GSON序列化时,它似乎试图序列化greenDAO生成的一些字段(对我来说不感兴趣)和崩溃。我希望序列化的对象引用其他生成的对象和生成的对象列表。

GSON说它允许使用toString()方法描述的序列化,我尝试了不同的方法,但是当我检查输出到文件时,它只是作为toString()方法出现。有人可以告诉我如何从toString()方法生成JSON对象,或者建议另一种方法来进行自定义序列化。

我的谢谢:)

2 个答案:

答案 0 :(得分:5)

最终想出来:)结果我需要为每个对象实现一个JsonSerializer并手动指定序列化。很乏味!对其他对象的引用需要嵌套,这是我使用toJsonTree()方法完成的。这是我最易阅读的序列化程序

private class InfoSerializer implements JsonSerializer<Info>
{
    @Override
    public JsonElement serialize(Info src, Type typeOfSrc,
            JsonSerializationContext context)
    {
         JsonObject obj = new JsonObject();
         obj.addProperty("details", src.getDetails());
         obj.addProperty("hostId", src.getHostId());
         obj.addProperty("dateCreated", src.getDateCreated().toString());
         obj.addProperty("expiryDate", src.getExpiryDate().toString());
         obj.add("alternativeInfo", getGsonInstance().toJsonTree(src.getAlternativeInfo()));
         obj.add("alternativeTimes", getGsonInstance().toJsonTree(src.getAlternativeTimes()));
         return obj;
    }   
}

注意:getGsonInstance()是我写的一个返回单例Gson对象的方法。

它被称为:

public String infoToJson(Info i)
{
    GsonBuilder gson = new GsonBuilder();
    gson.registerTypeAdapter(Info.class, new InfoSerializer());
    return gson.create().toJson(i);
}

答案 1 :(得分:1)

如果您只是想避免序列化某些字段,请记住您可以使用transient关键字对其进行标记。这意味着他们不会被Gson序列化。