当前位置: 首页 > 知识库问答 >
问题:

使用@JsonTypeInfo,为什么不能省略多态字段?

狄宏大
2023-03-14

下面是一个多态字段:

@JsonProperty("config")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(name = "keystone", value = KeystoneConfig.class),
    @JsonSubTypes.Type(name = "internal", value = InternalConfig.class)
})
@Nullable
abstract Configuration getConfig();

其中configuration是接口,type是结构/类中其他位置的string字段。

{ "type": "internal",
  "config": { "int1": "value1" }
}
{ "type": "internal"
}

在这种情况下我怎么会有这种行为呢?

共有1个答案

傅玮
2023-03-14

JacksonAnnotationIntrospectorJsonDeserializerJsonTypeResolver似乎对您的情况没有帮助。目前,我只能通过以下3个步骤来反序列化json字符串:

ObjectMapper mapper = new ObjectMapper();
// 1. deserializing the json string into JsonNode
JsonNode jsonNode = mapper.readTree(json);
// 2. Add a empty node if "config" property is not found
JsonNode configNode = jsonNode.get("config");
if (jsonNode.isObject() && (configNode == null || configNode.size() == 0)) {
    ((ObjectNode) jsonNode).put("config", "");
}
// 3. Convert to desired class
mapper.treeToValue(jsonNode, Foo.class);
 类似资料:
  • 问题内容: 我有以下代码,其中有一个父类及其子代。我试图确定代码如何从使用多态中受益。 当两者和我给出相同答案时,多态性有什么优势? 问题答案: 让我们首先看一下OO设计,继承表示IS- A关系,通常我们可以说“让我们飞起来”。可以说,每个特定的(子类)IS-A (父类)都适合这种“ 放飞”,而我们希望这种飞行实际上是特定的(子类)的飞行功能,那就是多态性接管了。 因此我们以抽象的方式,面向接口和

  • 问题内容: 如果我们采用以下代码: 相对于,更喜欢多态是什么意思,顺便说一句,为什么更好呢? 编辑: 我了解什么是多态性;我所缺少的是人们将如何使用它而不是。 问题答案: if … else …(或switch或Visitor)之间以及多态之间的主要区别是模块化。有所谓的开闭原理,这基本上意味着,当您向现有程序中添加新功能时,对现有代码所做的更改越少越好(因为每次更改都需要一些工作,并且可能会引入

  • Jackson中使用的注释是什么? ======================================== ============================================== 我的理解是,它还保留了被序列化的对象的具体类型以及实际数据。 我不清楚的是反序列化过程中的实际优势/收益是什么。 除了java文档之外,没有任何重要的文档。任何人都可以在这里提供帮助或提供

  • 问题内容: 我一直在阅读,在文件末尾使用PHP close标签是一种不好的做法。标头问题在以下情况下似乎无关紧要(这是迄今为止唯一的好参数): 现代版本的PHP在php.ini中设置了output_buffering标志。如果启用了输出缓冲,则可以在输出HTML之后设置HTTP标头和cookie,因为返回的代码不会立即发送到浏览器。 每本优秀实践书籍和Wiki均以该“规则”开头,但没有人提供充分的

  • 问题内容: 为什么每个人都告诉我编写这样的代码是一种不好的做法? 我省略花括号的最大论据是,有时花括号可能是花括号的两倍。例如,以下代码为C#中的标签绘制发光效果。 您还可以获得链接usings在一起的额外好处,而不必缩进一百万次。 花括号的最常见参数涉及维护编程,以及在原始if语句及其预期结果之间插入代码会引起的问题: 问题: 想要使用该语言提供的更紧凑的语法是错误的吗?设计这些语言的人很聪明,

  • 问题内容: 我了解这代表调用方法的对象,并且静态方法未绑定到任何对象。但是在上述情况下,变量y也是静态的。 如果我们可以在类对象上调用静态方法,为什么不能允许静态方法设置类的静态变量。 此附加约束的目的是什么? 问题答案: 因为是指对象实例。静态方法的调用中没有对象实例。但是当然你可以访问你的静态字段(仅静态字段!)。只需使用 如果要确保获取的是静态字段,而不是某些具有相同名称的局部变量,请使用类