用Jackson用两种不同的方式序列化一个类

在我们的一个项目中,我们使用与MongoDB实例对话的Java

Webapp。在数据库中,我们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 { }

}

然后使用正确的视图创建配置后进行序列化:

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

objectMapper.setSerializationConfig(conf);

然后将其序列化。在使用MongoDB包装器进行序列化时不指定视图将意味着该方法将被忽略。没有JsonView批注的属性默认情况下是序列化的,可以通过指定以下行为来更改行为:

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

可在Jackson Wiki上获得更多信息。

事实证明,还有其他替代方法:有Jackson混合功能,可以让您覆盖类的各个部分的(反序列化)行为,而无需修改类本身,从Jackson

2.0(最新发行版)开始,有过滤器也一样

以上是 用Jackson用两种不同的方式序列化一个类 的全部内容, 来源链接: utcz.com/qa/410739.html

回到顶部