2016-07-14 51 views
0

這裏是一個多態字段:使用@JsonTypeInfo爲什麼不能省略多態字段?

 
@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是一個接口,和typeString字段在結構/類其它地方。

這正常工作與響應的有效載荷(東西)是這樣的:

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

但未能與反序列化解析錯誤省略config場的時候,就像這樣:

 
{ "type": "internal" 
} 

通常情況下,當省略字段時,我們得到Java默認值(在這種情況下,我預期爲null)。我希望保留鑑別器字段type,但允許config字段爲可選字段。

在這種情況下,我該如何得到這種行爲?

+0

有同樣的問題,通過返回一個新的對象(類比提到的其他固定它在這裏)當它應該是空的。例如,@ JsonSubTypes.Type(name =「noConfig」,value = NullConfig.class) –

回答

0

JacksonAnnotationIntrospector,JsonDeserializerJsonTypeResolver似乎沒有幫助您的情況。 當時的心,我只能拿出一個解決辦法通過反序列化JSON字符串3步如下:

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); 
相關問題