当前位置: 首页 > 面试题库 >

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

乜栋
2023-03-14
问题内容

在我们的一个项目中,我们使用与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(最新发行版)开始,有过滤器也一样



 类似资料:
  • 我的Spring Boot API使用camelCase,但我需要通过我的API将一些请求代理到使用snake_case的第三方API。是否可以将Jackson配置为从snake_case反序列化第三方响应,然后将其序列化回camelCase到我的前端? 所需功能的逐步示例: 示例对象: 我调用我的API API调用第三方 第三方返回 我的API将其反序列化为 我的API序列化对象并返回 现在我使

  • 序列化和反序列化的方式不同于 我已经创建了两个序列化程序 和 我用Jackson查看了序列化/反序列化映射 ,但找不到解决方案。

  • 我正在尝试反序列化两种类型的json: 和 进入这些对象: 第一种方法创建两个新对象,第二种方法基于字符串的内容从数据库请求对象。 有点像杰克逊映射器如何将任意字符串反序列化为对象,对于这样的对象: 问题是我两者都需要。我需要它来处理对象和字符串。两者都可以从同一个输入到达。 我尝试的第一个想法是制造一个转换器 它说这些创建一个委托类型来传递给反序列化器,但是即使数据类型不是字符串,转换器也总是被

  • 我有一个这样的JSON: 所有类型都可以包含可变时间,或者只能有一种类型只有一次。 在SpringBoot应用程序中,我有三个类,扩展了公共类。 我有两种方法来序列化和反序列化它。 虽然测试序列化是可以的,但是反序列化在默认情况下不起作用。所以我修改了<code>CommonObject</code>如下: 现在,反序列化工作正常,但序列化不行。json值中包含属性< code>type两次。 有

  • 问题内容: 我有一个带有两个DateTime属性的类。我需要使用不同的格式序列化每个属性。我该怎么做?我试过了: 该解决方案不适用于我,因为它将日期格式应用于所有属性。有什么方法可以序列化具有不同格式的每个DateTime属性?也许有一些属性? 问题答案: 具有难以理解的结构,您可以使用以下自定义转换器之类的工具来执行所需的操作:

  • 反序列化XML文件时遇到问题。 无法将类型AlternativeB转换为类型AlternativeA 你们中有没有人对什么可能导致错误有一个想法或一个int?提前谢谢你。