在Play框架中,我有幾個模型具有對其他模型的對象引用字段。當我使用renderJSON時,我不希望包含這些對象引用。目前爲我的需要,我創建了一個單獨的視圖模型類,其中包含我想要的字段,並在控制器中根據需要創建此視圖類的實例。理想情況下,我希望能夠使用模型類本身而無需編寫視圖類。防止某些字段被序列化
有沒有一種方法來註釋一個字段,以便它在使用renderJSON時不會被序列化?
在Play框架中,我有幾個模型具有對其他模型的對象引用字段。當我使用renderJSON時,我不希望包含這些對象引用。目前爲我的需要,我創建了一個單獨的視圖模型類,其中包含我想要的字段,並在控制器中根據需要創建此視圖類的實例。理想情況下,我希望能夠使用模型類本身而無需編寫視圖類。防止某些字段被序列化
有沒有一種方法來註釋一個字段,以便它在使用renderJSON時不會被序列化?
因爲遊戲採用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));
}
我會重寫renderJSON來檢查字段名稱與成員序列化排除序列的名稱。
不知道爲什麼沒有人寫過的最直接的解決了這個答案,所以我會在這裏做:
只需通過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?
的感謝!一個簡單的問題,你爲什麼說使用@Expose更好? – 2015-01-15 05:34:51