【问题标题】:Prevent certain fields from being serialized防止某些字段被序列化
【发布时间】:2011-01-19 19:34:54
【问题描述】:

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

有没有办法对字段进行注解,这样在使用renderJSON时就不会被序列化?

【问题讨论】:

    标签: json serialization playframework


    【解决方案1】:

    因为 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));  
    }
    

    【讨论】:

    • 谢谢!一个简单的问题,为什么你说使用 @Expose 更好?
    • @Matias Elorriaga 我个人更喜欢显式方法 :) 我经常遇到这种情况,我不小心暴露了字段。
    【解决方案2】:

    FlexJSON 与播放一起使用是另一种选择,在本文中进行了解释:http://www.lunatech-research.com/archives/2011/04/20/play-framework-better-json-serialization-flexjson

    【讨论】:

      【解决方案3】:

      不知道为什么没有人为此答案编写最直接的解决方案,所以我会在这里做:

      只需将您不想通过 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?

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-19
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多