杰克逊注释用于序列化,但我找不到具有不同行为的两种不同视图的解决方案。拥有以下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实例中注册。
此外,我不确定如果不设置视图,我只想拥有公共视图,但目前显示所有非空值。知道如何只通过注释来实现它吗?