杰克逊定制序列化吸气剂

时间:2015-04-09 13:49:17

标签: java json jackson

我们说我有一个POJO:

public class User {
     private Long id;
     private String username;

     // usual getters and setters
     ....

     // only for serialisation purposes
     public String getUpperUsername() {
         return this.id % 2 == 0 ? username : username.toUpperCase();
     }


}

我想创建一个条件序列化程序,以便在满足某些条件时序列化与实际值不同的值。

我看了@JsonGetter,但显然它被弃用了,@ JsonProperty似乎无法工作。

你有什么想法吗?

提前谢谢你:)

2 个答案:

答案 0 :(得分:4)

当我像这样使用它时,@ jsonProperty实际上适用于我:

public class User {
      private Long id;
      private String username;

      public Long getId() {
         return id;
      }

      public void setId(Long id) {
         this.id = id;
      }

      public String getUsername() {
         return username;
      }

      public void setUsername(String username) {
         this.username = username;
      }

      @JsonProperty("username")
      public String getUppercaseUsername() {
         return this.id % 2 == 0 ? username : username.toUpperCase();
      }
}

查看测试示例here

如果要将此大写逻辑与实体本身分开,您还可以使用自定义序列化程序,如here

然而事实是,这是一个业务逻辑,不应该由串行器处理 - 这是设计失败。而是将用户名映射到其他地方并仅使用Jackson进行序列化 - 这是该库的目的。

答案 1 :(得分:2)

您可以尝试编写实现JsonSerializer的自定义序列化程序并使用@JsonSerialize:http://www.baeldung.com/jackson-custom-serialization
但这似乎有点矫枉过正。

另外,如果可以接受,你可以尝试将getUpperUsername()的逻辑放在通常的getter中。

PS:奇怪的是@JsonProperty不起作用,它在这里匹配。