这是一个多态字段:
@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
字段为可选字段。
在这种情况下如何获得该行为?
答案 0 :(得分:1)
JacksonAnnotationIntrospector
,JsonDeserializer
和JsonTypeResolver
似乎对您的案例没有帮助。
目前,我只能按照以下步骤通过反序列化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);