使用Jackson进行序列化和反序列化:如何以编程方式忽略字段?

时间:2012-06-27 17:43:17

标签: java json rest jackson

我正在使用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)

2 个答案:

答案 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并设置值的一些反射技巧,但是,如果是这样,那将非常严厉。