java - 用 jackson 以两种不同的方式序列化一个类

标签 java mongodb jackson pojo mongo-jackson-mapper

在我们的一个项目中,我们使用 java webapp 与 MongoDB 实例对话。在数据库中,我们使用 DBRefs 来跟踪一些对象关系。我们使用 jackson(使用 mongodb-jackson-mapper)对 POJO 对象进行(反)序列化。

但是,我们使用相同的 POJO 然后(反)序列化到外部世界,我们的前端处理呈现 JSON。

现在,我们需要一种方法让外部世界的序列化包含来自 DBRef 的引用对象(以便 UI 可以呈现完整的对象),而我们显然希望拥有DBRef 写入数据库,而不是整个对象。

现在我写了一些未经测试的静态嵌套类代码:

public static class FooReference {
    public DBRef<Foo> foo;

    // FIXME how to ensure that this doesn't go into the database?
    public Foo getFoo() {
        return foo.fetch();
    }
}

理想情况下,我想要一种注释方法,以便我可以(反)序列化它,无论是否有 getFoo() 结果,可能取决于某些配置对象。这可能吗?你有没有更好的方法来做这件事?

最佳答案

通过查看选项,您似乎可以将属性注释为仅在给定的 View 传递给用于序列化的 ObjectMapper 时显示。因此,您可以编辑该类:

public static class FooReference {
    public DBRef<Foo> foo;

    @JsonView(Views.WebView.class)
    public Foo getFoo() {
        return foo.fetch();
    }
}

并提供:

class Views {
    static class WebView { }
}

然后在使用正确 View 创建配置后进行序列化:

SerializationConfig conf = objectMapper.getSerializationConfig().withView(Views.WebView.class);
objectMapper.setSerializationConfig(conf);

然后将其序列化。使用 MongoDB 包装器进行序列化时未指定 View 将意味着该方法将被忽略。没有 JsonView 注解的属性默认是序列化的,你可以通过指定来改变这个行为:

objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);

更多信息可用on the Jackson Wiki .

事实证明,还有其他选择:有 Jackson MixIns这将允许您在不修改类本身的情况下覆盖(反)类的部分序列化行为,并且截至 Jackson 2.0(最新版本)有 filters ,也是。

关于java - 用 jackson 以两种不同的方式序列化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141561/

相关文章:

java - 从单个数据库中通过 id AND St​​ring 获取数据

mongodb - 使用 node.js/MongoDB/Mongoose 进行回调

security - 在 Amazon EC2 上访问 Mongodb 的问题

javascript - Multer 阵列本地镜像未保存在 Express 或 React 中

java - 比较两个 JSON 对象的数字容差

java - java中使用jackson进行继承反序列化

java - Java中的排序集合

java - 设置大小不会在 java 中工作

java - 将图像编码为视频时出现 JCodec 错误

java - 将 aws-java-sdk 添加到 pom 时,@JsonIgnore 不起作用。为什么?