杰克逊反序列化意外令牌(END_OBJECT),

时间:2011-09-21 16:02:52

标签: json polymorphism deserialization jackson

我试图在一个Abstact类“Animal”上使用Jackson注释将JSON对象反序列化为Java对象:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")  
@JsonSubTypes({@Type(value = Dog.class, name = "chien"),
@Type(value = Cat.class, name= "chat")}) 

这是一个示例JSON字符串:

{
    "name": "Chihuahua",
    "type": {
                "code": "chien",
                "description": "Chien mechant"
            }
}

问题是JSON对象中的属性“type”也是一个对象。当我尝试反序列化时,我有这个例外:

Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id '{' into a subtype of [simple type, class Animal]

我尝试使用“type.code”作为“属性”值,但没有。 Exeption就是这个

Caused by: org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type.code' that is to contain type id  (for class Animal)

知道什么是错的。谢谢。

2 个答案:

答案 0 :(得分:0)

在找不到解决此问题的方法之后将其丢弃。如果任何偶然发现这一点的人感兴趣的话,我想出了自己的风格。如果您找到其他方法,请随意添加自己的解决方案。

我已经在我的枚举中实现了修复此问题的方法是添加一个findByType方法,该方法允许您搜索枚举键值的字符串表示形式。 因此,在您的示例中,您有一个带有键/值对的枚举,

pubilc enum MyEnum { 
...
CHIEN("chien", "Chien mechant")
...
}
// Map used to hold mappings between the event key and description
private static final Map<String, String> MY_MAP = new HashMap<String, String>();

// Statically fills the #MY_MAP.
static {
    for (final MyEnum myEnum: MyEnum.values()) {
        MY_MAP.put(myEnum.getKey(), myEnum);
    }
}

然后你会有一个公共方法findByTypeCode,它会返回你搜索的键的类型:

public static MyEnum findByKey(String pKey) {
    final MyEnum match = MY_MAP.get(pKey);
    if (match == null) {
        throw new SomeNotFoundException("No match found for the given key: " + pKey);
    }
    return match;
}

我希望这会有所帮助。就像我说的那样,可能有一个解决方案可以直接解决这个问题,但是我没有找到一个解决方案,并且当这个工作得很好时,不需要浪费更多的时间来寻找解决方案。

答案 1 :(得分:-3)

我是杰克逊的初学者,但我认为你必须像解释here一样搜索树解析