2012-04-18 92 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