gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:25:59 26 4
gpt4 key购买 nike

在我们的一个项目中,我们使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com