我使用的是杰克逊序列化和反序列化对象。 问题是,有时我想说明一个字段,有时没有。
其实我使用@JsonIgnore避免财产的打印时我并不需要它。 当我需要它,我通过禁用物业
mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS);
但是这也将禁用,我需要其他注释。
我怎样才能得到结果,我需要? 使用视图? 任何例子吗?
小POJO明白我想要什么:
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)
我想你应该这样处理不同的方式,通过创建一个自定义的串行杰克逊能选择性序列化/忽略密码。
像这样的注解,应考虑在运行时不可变的。 可能会有一些反思招提取JsonIgnore
并设置值,但是,如果是这样,这将是非常严厉的。
最终,我以不同的方式来处理这一点。 我用的是新泽西州和吉斯所以是一个比较难找到如何,但我做到了。
基本上我用杰克逊的混入注释,但使用泽西我不得不创建ObjectMapper成提供商,然后用吉斯绑定。
这样,当我使用REST服务新泽西州将使用在提供商所定义的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
希望这会帮助别人浪费更少的时间!
文章来源: Serialization and Deserialization with Jackson: how to programmatically ignore fields?