2012-04-18 45 views
3

编辑:解决了,将标志着我的答案时,所以让我:)如何使用GSON指定序列化?

我使用greenDAO产生了一堆的班,当我试图让GSON以连载他们,似乎试图连载一些由greenDAO生成的字段(对我来说不感兴趣)和崩溃。我希望序列化的对象引用其他生成的对象和生成对象的列表。我试过不同的方法,但是当我检查输出到一个文件时,它只是作为toString()方法出现。有人可以告诉我如何从toString()方法生成JSON对象,或者提供另一种自定义序列化的方法。

我谢谢:)

回答

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

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

+2

问题是,如果(并可能当)我重新生成greenDao对象,我将不得不手动重新标记好的100个字段为瞬态。 – Chironex 2012-04-18 22:46:12

+0

啊,无赖。我有点惊讶的DAO库缺乏对瞬态场的支持。 – Tom 2012-04-18 22:53:33

+0

主要的问题是它生成了很多用于它自己的数据库映射和内部函数的字段,在生成类之前我无法编辑它们。 – Chironex 2012-04-18 23:33:35