2011-01-19 144 views
5

在Play框架中,我有幾個模型具有對其他模型的對象引用字段。當我使用renderJSON時,我不希望包含這些對象引用。目前爲我的需要,我創建了一個單獨的視圖模型類,其中包含我想要的字段,並在控制器中根據需要創建此視圖類的實例。理想情況下,我希望能夠使用模型類本身而無需編寫視圖類。防止某些字段被序列化

有沒有一種方法來註釋一個字段,以便它在使用renderJSON時不會被序列化?

回答

12

因爲遊戲採用GSON其JSON序列化,你可以嘗試以下方法:

public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithModifiers(Modifier.TRANSIENT) 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 

現在每場標記爲瞬態不會被序列化。還有另一種(更好的)方法。您可以使用com.google.gson.annotations.Expose註釋標記要序列化的每個字段。

public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithoutExposeAnnotation() 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 
+0

的感謝!一個簡單的問題,你爲什麼說使用@Expose更好? – 2015-01-15 05:34:51

-1

我會重寫renderJSON來檢查字段名稱與成員序列化排除序列的名稱。

0

不知道爲什麼沒有人寫過的最直接的解決了這個答案,所以我會在這裏做:

只需通過Gson標記您不希望序列化的字段爲transient

下面是一個例子:

public class Animal 
{ 
     private String name = "dog"; 
     transient private int port = 80; 
     private String species = "canine"; 
     transient private String password = "NoOneShouldSeeThis"; 
} 

其標記爲瞬時的項目都不會被序列化。 反序列化時,它們將被設置爲默認值(默認值)。

生成的JSON看起來像下面這樣:

{"name":"dog","species":"canine"} 

欲瞭解更多有關瞬間就可以看到SO Why does Java have transient fields?

相關問題