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

时间:2016-07-14 12:02:12

标签: java jackson

这是一个多态字段:

@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" }
}

但在省略config字段时失败并出现反序列化解析错误,如下所示:

{ "type": "internal"
}

通常,当省略字段时,我们得到Java默认值(在这种情况下我期望null)。我希望保留鉴别字段type,但允许config字段为可选字段。

在这种情况下如何获得该行为?

1 个答案:

答案 0 :(得分:1)

JacksonAnnotationIntrospectorJsonDeserializerJsonTypeResolver似乎对您的案例没有帮助。 目前,我只能按照以下步骤通过反序列化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);