Ctr*_*rlF 4 java json jackson deserialization
我正在使用Jackson从我不拥有的服务器反序列化json响应.我正在使用JsonTypeInfo注释来处理多态数据类型.这是我的基本类型的配置(Thing在这种情况下):
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Thing.class, name = "Thing"),
@JsonSubTypes.Type(value = FancyThing.class, name = "FancyThing")
})
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到服务器返回一个空字符串,我期待这些类型之一,然后我得到其中一个:
org.codehaus.jackson.map.JsonMappingException: Unexpected token (VALUE_STRING), expected FIELD_NAME: missing property 'type' that is to contain type id (for class com.stackoverflow.Thing)
是否有推荐的处理此类案件的方法?就像我说的,我不控制服务器,所以我必须处理这个客户端.我宁愿通过配置来处理这个问题ObjectMapper,但ObjectMapper#configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)似乎并没有像我预期的那样工作.有任何想法吗?
好的,所以有时候只需要问自己一个正确的问题.事实证明,我认为我正在查看旧版本的javadoc,因为我发现@JsonTypeInfo#defaultImpl并且这让我走上正轨.
现在我有一些看起来像这样的东西:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
defaultImpl = EmptyThing.class)
@JsonSubTypes({
@JsonSubTypes.Type(value = Thing.class, name = "Thing"),
@JsonSubTypes.Type(value = FancyThing.class, name = "FancyThing")
})
public class Thing {
...
}
public class EmptyThing extends Thing {
public EmptyThing(String s) {
// Jackson wants a single-string constructor for the default impl
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13936 次 |
| 最近记录: |