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