杰克逊序列化与null

时间:2016-11-18 13:36:34

标签: java json serialization jackson

杰克逊注释用于序列化,但我找不到具有不同行为的两种不同视图的解决方案。拥有以下json:

{
  "username": "username",
  "manager": null,
  "password": "pwd"
}

我想在第一个视图(public:no null且没有敏感信息)的情况下必须关注输出:

{
  "username": "username"
}

对于第二个视图(内部:传入的空值显示敏感信息被散列):

{
  "username": "username",
  "manager": null,
  "password": "hashedValue"
}

问题是当没有提供可选字段时,如下面的json:

{
  "password": "pwd"
}

我希望公开一个空,只在内部视图中使用哈希密码:

{
  "password": "hashedValue"
}

我有以下课程:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Test {
  private String username;
  private String manager;
  private String password;

  @JsonView(Views.Internal.class)
  @JsonSerialize(using = Md5Serializer.class)
  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public String getUsername() {
    return username;
  }

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

  public String getManager() {
    return manager;
  }

  public void setManager(String manager) {
    this.manager = manager;
  }
}

这可以做我想要的大多数事情,但是如果一个值因为默认值而为空,或者因为它来自JSON,它就无法发挥作用。

另一种方法是在对象内使用Map:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Test {

  private Map<String, String> content = new HashMap<>();

  @JsonView(Views.Internal.class)
  @JsonSerialize(using = Md5Serializer.class)
  @JsonIgnore
  public String getPassword() {
    return this.content.get("password");
  }

  @JsonSetter
  public void setPassword(String password) {
    this.content.put("password", password);
  }

  @JsonIgnore
  public String getUsername() {
    return this.content.get("username");
  }

  @JsonSetter
  public void setUsername(String username) {
    this.content.put("username", username);
  }

  @JsonIgnore
  public String getManager() {
    return this.content.get("manager");
  }

  @JsonSetter
  public void setManager(String manager) {
    this.content.put("manager", manager);
  }

  @JsonAnyGetter
  public Map<String, String> getContent() {
    return this.content;
  }
}

在这种情况下,密码未经过哈希处理(并且此处无法存储哈希值)。

如果使用了getter并且删除了JsonAnyGetter,则无法序列化传入的null,因为JsonInclude忽略该字段。我正在阅读很多可以使用BeanSerializerModifier但是也需要在所有ObjectMapper实例中注册。

此外,我不确定如果不设置视图,我只想拥有公共视图,但目前显示所有非空值。知道如何只通过注释来实现它吗?

0 个答案:

没有答案