我有一个从服务器发送到服务器的用户对象。当我发送用户对象时,我不想将散列后的密码发送给客户端。因此,我在password属性上添加了@JsonIgnore,但这也阻止了它被反序列化为密码,这使得在用户没有密码时很难注册用户。
我怎么能只得到@JsonIgnore应用于序列化而不是反序列化?我使用的是Spring JSONView,所以我对ObjectMapper没有太多的控制。
我尝试过的事情:
向属性中添加@JsonIgnore 只在getter方法上添加@JsonIgnore
我有一个从服务器发送到服务器的用户对象。当我发送用户对象时,我不想将散列后的密码发送给客户端。因此,我在password属性上添加了@JsonIgnore,但这也阻止了它被反序列化为密码,这使得在用户没有密码时很难注册用户。
我怎么能只得到@JsonIgnore应用于序列化而不是反序列化?我使用的是Spring JSONView,所以我对ObjectMapper没有太多的控制。
我尝试过的事情:
向属性中添加@JsonIgnore 只在getter方法上添加@JsonIgnore
当前回答
在我的例子中,我让Jackson自动(反)序列化我从Spring MVC控制器返回的对象(我在Spring 4.1.6中使用@RestController)。我不得不使用com.fasterxml.jackson.annotation.JsonIgnore而不是org.codehaus.jackson. annotation。JsonIgnore,否则,它什么也不做。
其他回答
你还可以这样做:
@JsonIgnore
@JsonProperty(access = Access.WRITE_ONLY)
private String password;
这对我很有效
另一种简单的处理方法是在注释中使用allowSetters=true参数。这将允许密码被反序列化到dto中,但不会序列化到使用contains对象的响应体中。
例子:
@JsonIgnoreProperties(allowSetters = true, value = {"bar"})
class Pojo{
String foo;
String bar;
}
foo和bar都被填充到对象中,但只有foo被写入响应体。
你可以在类级别使用@JsonIgnoreProperties,并将你想忽略的变量放在json的“value”参数中。对我来说还不错。
@JsonIgnoreProperties(value = { "myVariable1","myVariable2" })
public class MyClass {
private int myVariable1;,
private int myVariable2;
}
我也在找类似的东西。我仍然想序列化我的属性,但想使用不同的getter改变值。在下面的示例中,我将反序列化真实密码,但将序列化为屏蔽密码。以下是如何做到这一点:
public class User() {
private static final String PASSWORD_MASK = "*********";
@JsonIgnore
private String password;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
public String setPassword(String password) {
if (!password.equals(PASSWORD_MASK) {
this.password = password;
}
}
public String getPassword() {
return password;
}
@JsonProperty("password")
public String getPasswordMasked() {
return PASSWORD_MASK;
}
}
理想的解决方案是使用DTO(数据传输对象)