Java Jackson的序列化和反序列化:如何以编程方式忽略字段?

Java Jackson的序列化和反序列化:如何以编程方式忽略字段?,java,json,rest,jackson,Java,Json,Rest,Jackson,我使用Jackson来序列化和反序列化对象。问题是,有时我想显示一个字段,有时我不想 实际上,我使用@JsonIgnore来避免在不需要时打印属性。当我需要它时,我会通过 mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS); 但这也将禁用我需要的其他注释 我怎样才能得到我需要的结果?使用视图?有什么例子吗 了解我想要什么的一点小技巧: class User { private

我使用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);
}

通过RESTAPI,您可以在不使用密码的情况下获得用户名(感谢JsonIgnore)

我认为您应该以另一种方式处理此问题,创建一个定制的Jackson序列化程序,可以选择性地序列化/忽略密码


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

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


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

最后,我以不同的方式处理了这个问题。我用的是Jersey和Guice,所以想知道怎么用有点困难,但我做到了

基本上,我使用了Jackson的MixIn注释,但使用Jersey,我必须将ObjectMapper创建到提供者中,然后用Guice绑定它

这样,当我使用REST服务时,Jersey将使用提供者中定义的ObjectMapper;在存储这些内容时,Jackson将使用标准的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;
  }
}
就这样D


希望这能帮助别人少浪费时间

最后,我以不同的方式处理了这个问题。我用的是Jersey和Guice,所以想知道怎么用有点困难,但我做到了

基本上,我使用了Jackson的MixIn注释,但使用Jersey,我必须将ObjectMapper创建到提供者中,然后用Guice绑定它

这样,当我使用REST服务时,Jersey将使用提供者中定义的ObjectMapper;在存储这些内容时,Jackson将使用标准的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;
  }
}
就这样D

希望这能帮助别人少浪费时间