我有一个实体类,其中包含一个密码字段:
class User {
private String password;
//setter, getter..
}
我希望在序列化时跳过这个字段,但仍然能够反序列化。这很重要,以便客户端可以发送给我一个新的密码,但不能读取当前的密码。
如何使用Jackson实现?
您可以将其标记为@JsonIgnore
。
从1.9版本开始,您可以为getter添加@JsonIgnore
,为setter添加@JsonProperty
,以使其反序列化但不进行序列化。
@JsonIgnore
注解,在setter方法上添加@JsonProperty
注解,以使其在反序列化时生效但不会被序列化。 - StaxMantransient
(例如 private transient String password;
),但是除非启用了 MapperFeature.PROPAGATE_TRANSIENT_MARKER,否则具有公共 getter 的 transient
字段将被忽略。 - tom@JsonIgnore
,在setter上使用@JsonProperty
会使单一属性进行反序列化而不进行序列化。然而,当我在List<Foo>
字段上执行相同操作时,它并不能反序列化?有什么解决方法吗? - Farrukh Najmi补充一下StaxMan所说的,这对我有效
private String password;
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
@JsonIgnore
。 - Ferran Maylinch从Jackson 2.6开始,属性可以被标记为只读或只写。这比在两个访问器上操作注释更简单,并将所有信息保存在一个位置:
public class User {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
}
class User {
private String password;
public void setPassword(String password) {
this.password = password;
}
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty("password")
public String getEncryptedPassword() {
// encryption logic
}
}
除了@JsonIgnore
外,还有其他几种可能性:
@JsonIgnoreProperties
可能对类有用transient
对我来说是一个解决方案。谢谢!它是Java的本地功能,避免了您添加另一个特定于框架的注释。
@JsonFilter("custom_serializer")
class User {
private String password;
//setter, getter..
}
String[] fieldsToSkip = new String[] { "password" };
ObjectMapper mapper = new ObjectMapper();
final SimpleFilterProvider filter = new SimpleFilterProvider();
filter.addFilter("custom_serializer",
SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip));
mapper.setFilters(filter);
String jsonStr = mapper.writeValueAsString(currentUser);
password
字段被序列化。同时,您将能够将password
字段反序列化为原始值。只需确保在ObjectMapper对象上未应用任何过滤器即可。ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(yourJsonStr, User.class); // user object does have non-null password field
一个人应该问为什么要为密码创建一个公共的getter方法。Hibernate或任何其他ORM框架都可以使用私有getter方法。如果需要检查密码是否正确,可以使用
public boolean checkPassword(String password){
return this.password.equals(anyHashingMethod(password));
}
将变量设置为
@JsonIgnore
这样可以使变量被json序列化器跳过。
@JsonIgnore
,但在 setter 上添加@JsonProperty
,这样就不会序列化,但可以反序列化。 - StaxMan