序列化和反序列化与杰克逊:如何以编程方式忽略字段?(Serialization and Deseri

2019-06-25 20:25发布

我使用的是杰克逊序列化和反序列化对象。 问题是,有时我想说明一个字段,有时没有。

其实我使用@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)

Answer 1:

我想你应该这样处理不同的方式,通过创建一个自定义的串行杰克逊能选择性序列化/忽略密码。

像这样的注解,应考虑在运行时不可变的。 可能会有一些反思招提取JsonIgnore并设置值,但是,如果是这样,这将是非常严厉的。



Answer 2:

最终,我以不同的方式来处理这一点。 我用的是新泽西州和吉斯所以是一个比较难找到如何,但我做到了。

基本上我用杰克逊的混入注释,但使用泽西我不得不创建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?