我正在使用Jackson序列化和反序列化对象。问题是有时候我想要显示一个字段,有时候不显示。
实际上,当我不需要时,我正在使用@JsonIgnore来避免打印属性。当我需要它时,我通过
禁用该属性mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS);
但这也会禁用我需要的其他注释。
如何获得我需要的结果?使用视图?任何一个例子?
有点儿了解我想要的东西:
class User {
private String username;
@JsonIgnore
private String password;
// getter setter
}
writeToDB() {
mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS);
mapper.writeValueAsString(user);
}
通过REST API,您可以获得没有密码的用户名(感谢JsonIgnore)
答案 0 :(得分:3)
最后,我以不同的方式处理了这个问题。我正在使用Jersey和Guice所以有点难以找到,但我做到了。
基本上我使用了Jackson的MixIn注释但使用Jersey我必须将ObjectMapper创建到Provider中,然后将其与Guice绑定。
这样当我使用REST服务时,Jersey将使用Provider中定义的ObjectMapper;当存储东西时,杰克逊将使用标准的ObjectMapper。
现在有些代码。
创建PrivateUser类:
public abstract class PrivateUser {
@JsonIgnore abstract String getPassword();
}
创建提供者:
@Provider
public class JacksonMixInProvider implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(Class<?> aClass) {
final ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().addMixInAnnotations(User.class, PrivateUser.class);
return mapper;
}
}
并绑定它:
bind(JacksonMixInProvider.class).asEagerSingleton();
就是这样! :d
希望这会帮助别人浪费更少的时间!
答案 1 :(得分:1)
我认为你应该通过创建一个可以选择性地序列化/忽略密码的自定义Jackson序列化器来以不同的方式处理它。
这样的注释应该在运行时被认为是不可变的。 可能是提取JsonIgnore
并设置值的一些反射技巧,但是,如果是这样,那将非常严厉。