杰克逊:“意外的令牌(VALUE_STRING),预期的FIELD_NAME:”在反序列化空字符串而不是预期的对象时

时间:2013-11-04 09:57:03

标签: 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")
})

一切正常,直到服务器返回一个空字符串,我期待其中一种类型,然后我得到其中一种:

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)似乎没有按照我的预期运作。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

好的,所以有时候只需要问自己一个正确的问题。事实证明,我认为我正在查看javadocs的旧版本,因为我发现了@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
    }
}