在Play框架中,我有一些模型,其中的字段是对其他模型的对象引用。当我使用renderJSON时,我不希望包含这些对象引用。目前,根据我的需要,我创建了一个单独的视图模型类,其中包含我想要的字段,并在控制器中根据需要创建此视图类的实例。理想情况下,我希望能够使用模型类本身,而无需编写视图类。
有没有办法注释一个字段,以便在使用renderJSON时不会将其序列化?
答案 0 :(得分:11)
因为Play使用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));
}
答案 1 :(得分:2)
在游戏中使用FlexJSON是另一种选择,在本文中进行了解释:http://www.lunatech-research.com/archives/2011/04/20/play-framework-better-json-serialization-flexjson
答案 2 :(得分: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?
答案 3 :(得分:-1)
我会覆盖renderJSON以针对序列化排除的成员数组检查字段名称。