杰克逊自定义序列化getter

7
假设我有一个类似于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 似乎不起作用。你有什么想法吗?提前感谢您 :)

1
你可以告诉我为什么 @JsonProperty 对你不起作用,它对我有效...请看我的回答。 - makasprzak
@JsonGetter 只是 @JsonProperty 的别名,因此它应该工作类似。 - StaxMan
2个回答

12

当我像这样使用@ JsonProperty时,它对我实际上起作用:

@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();
      }
}

点击此处可查看测试示例。

如果您希望将大写逻辑与实体本身分离,也可以使用自定义序列化程序,如此处

然而,事实是这是业务逻辑,不应由序列化器处理-这是设计上的失误。相反,请在其他地方映射用户名并仅使用Jackson进行序列化-这是此库的目的。


我尝试了完全相同的操作,但它并没有将任何字母变成大写。也许我部署了旧的 EAR 或者像那样一些愚蠢的错误……非常感谢,macias :) - user3159152

2
您可以尝试编写自定义序列化程序,实现JsonSerializer并使用@JsonSerialize。这是一个参考链接:http://www.baeldung.com/jackson-custom-serialization。但是这看起来有点过度。
另外,如果可行的话,您可以尝试将getUpperUsername()的逻辑放在通常的getter中。
PS:奇怪的是@JsonProperty不起作用,它在此处匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接