【问题标题】:Serialization and Deserialization with Jackson: how to programmatically ignore fields?Jackson 的序列化和反序列化:如何以编程方式忽略字段?
【发布时间】:2012-06-29 05:30:37
【问题描述】:

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

【问题讨论】:

    标签: java json rest jackson


    【解决方案1】:

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

    基本上我使用了 Jackson 的 MixIn 注释,但使用 Jersey 我必须将 ObjectMapper 创建为 Provider,然后将其与 Guice 绑定。

    这样我在使用REST服务时Jersey会使用Provider中定义的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;
      }
    }
    

    并绑定它:

    bind(JacksonMixInProvider.class).asEagerSingleton();
    

    就是这样! :D

    希望这会帮助其他人减少浪费时间!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-21
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2019-10-22
        • 1970-01-01
        • 2016-12-11
        相关资源
        最近更新 更多