防止某些字段被序列化

时间:2011-01-19 19:34:55

标签: json serialization playframework

在Play框架中,我有一些模型,其中的字段是对其他模型的对象引用。当我使用renderJSON时,我不希望包含这些对象引用。目前,根据我的需要,我创建了一个单独的视图模型类,其中包含我想要的字段,并在控制器中根据需要创建此视图类的实例。理想情况下,我希望能够使用模型类本身,而无需编写视图类。

有没有办法注释一个字段,以便在使用renderJSON时不会将其序列化?

4 个答案:

答案 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)

答案 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以针对序列化排除的成员数组检查字段名称。