Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 防止某些字段被序列化_Json_Serialization_Playframework - Fatal编程技术网

Json 防止某些字段被序列化

Json 防止某些字段被序列化,json,serialization,playframework,Json,Serialization,Playframework,在Play框架中,我有几个模型,其中的字段是对其他模型的对象引用。当我使用renderJSON时,我不希望包含那些对象引用。目前,为了满足我的需要,我创建了一个单独的视图模型类,其中包含我想要的字段,并在控制器中根据需要创建该视图类的实例。理想情况下,我希望能够使用模型类本身,而不必编写视图类 有没有一种方法可以注释一个字段,以便在使用renderJSON时它不会被序列化?我会覆盖renderJSON,根据序列化排除的成员数组检查字段名。因为play使用Gson进行Json序列化,所以您可以尝试

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


有没有一种方法可以注释一个字段,以便在使用renderJSON时它不会被序列化?

我会覆盖renderJSON,根据序列化排除的成员数组检查字段名。

因为play使用Gson进行Json序列化,所以您可以尝试以下操作:

public static void test()  
{  
    Object foo = new SomeObject("testData");  
    Gson gson = new GsonBuilder()
        .excludeFieldsWithModifiers(Modifier.TRANSIENT)  
        .create();
    renderJSON(gson.toJson(foo));  
}
{"name":"dog","species":"canine"}
现在,标记为瞬态的每个字段都不会被序列化。还有另一种(更好的)方法。您可以使用
com.google.gson.annotations.Expose
注释来标记要序列化的每个字段

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

使用with play是另一个选项,本文对此进行了解释:

不确定为什么没有人为这个答案编写最直接的解决方案,因此我将在这里进行说明:

只需将不希望通过Gson序列化的字段标记为瞬态字段即可

下面是一个例子:

public class Animal
{
        private String name = "dog";
        transient private int port = 80;
        private String species = "canine";
        transient private String password = "NoOneShouldSeeThis";
}
标记为瞬态的项都不会序列化。 反序列化时,它们将设置为默认值(类默认值)

生成的JSON将如下所示:

public static void test()  
{  
    Object foo = new SomeObject("testData");  
    Gson gson = new GsonBuilder()
        .excludeFieldsWithModifiers(Modifier.TRANSIENT)  
        .create();
    renderJSON(gson.toJson(foo));  
}
{"name":"dog","species":"canine"}
有关瞬态的更多信息,请参见SO

谢谢!一个简单的问题,为什么你说使用@Expose更好?@Matias eloriaga我个人更喜欢显式方法:)我经常会意外地暴露字段。