2

我正在使用 Jackson 来序列化和反序列化对象。问题是有时我想显示一个字段,有时不想。

实际上,我正在使用 @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)

4

2 回答 2

3

最后,我以不同的方式处理了这个问题。我使用的是 Jersey 和 Guice,所以很难找到方法,但我做到了。

基本上我使用了 Jackson 的 MixIn 注释,但使用 Jersey 我必须将 ObjectMapper 创建到提供程序中,然后将其与 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

希望这将帮助其他人浪费更少的时间!

于 2012-06-28T11:01:19.053 回答
1

我认为你应该以不同的方式处理这个问题,通过创建一个可以选择性地序列化/忽略密码的自定义 Jackson 序列化程序。

像这样的注释在运行时应该被认为是不可变的。可能有一些反射技巧来提取JsonIgnore和设置值,但是,如果是这样,这将是非常严厉的。

于 2012-06-27T18:58:03.250 回答