【问题标题】:Jackson Yaml Type Info is wrong on serializationJackson Yaml 类型信息在序列化时出错
【发布时间】:2017-03-09 09:40:49
【问题描述】:

通过 Jackson 将对象序列化为 yml 时,我得到以下输出:

---
commands:
  dev: !<foo.bar.baz.DevCommand>

但是,我想要的是:

---
commands:
  dev: 
    type: foo.bar.baz.DevCommand

我能够很好地反序列化。也就是说,反序列化部分按预期工作。我在我能想到的任何地方都放了以下注释:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="type")

包括 DevCommand 接口、DevCommand 上的具体类、具有 commands 映射的类型(包括字段和 getter/setter)。

我需要做什么来强制 Jackson 使用我想要的类型格式?

【问题讨论】:

  • 来自 JsonTypeInfo 的文档:用于配置类型信息是否以及如何与 JSON 序列化和反序列化一起使用的详细信息 - 因为您序列化为YAML,根本不适用,Jackson 改用 YAML 的标签系统。
  • @flyx 但是它使用JsonTypeInfo注解来配置yaml的反序列化......

标签: java jackson yaml


【解决方案1】:

Yaml 已经内置了类型信息,因此 Jackson 默认使用它。从 this issue 开始,修复是禁用使用本机类型 id。

YAML 具有原生类型 ID 和对象 ID,因此默认使用它们 (假设这是用户喜欢的)。但是您可以通过以下方式禁用它:

YAMLGenerator.Feature.USE_NATIVE_TYPE_ID

并专门禁用它;类似:

YAMLFactory f = new YAMLFactory();
f.disable(YAMLGenerator.Feature.USE_NATIVE_TYPE_ID);
ObjectMapper m = new ObjectMapper(f);

或者,为了方便

YAMLMapper m = new YAMLMapper()
 disable(YAMLGenerator.Feature.USE_NATIVE_TYPE_ID);

【讨论】:

  • 你太棒了,伙计!谢谢!
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多