Неожиданный токен десериализации Джексона (END_OBJECT),

Я пытаюсь десериализовать объект JSON в объект Java, используя аннотацию Джексона для одного класса Abstact «Животное»:

@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 также является объектом. когда я пытаюсь десериализовать, у меня есть это исключение:

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

Я пытался использовать «type.code» как значение «свойства», но ничего. Исключение это

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)

Любая идея, что не так. Спасибо.


person Jorge    schedule 21.09.2011    source источник


Ответы (2)


Бросив это там после того, как не нашел решения этой проблемы. Я придумал свой стиль, если это заинтересует любого, кто наткнется на это. Не стесняйтесь добавлять свои собственные решения, если вы найдете другой способ.

Я реализовал в своих перечислениях, чтобы решить эту проблему, добавить метод 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;
}

Надеюсь, это поможет. Как я уже сказал, может быть решение, которое решает эту проблему напрямую, но я его не нашел, и мне не нужно тратить больше времени на поиск решения, когда оно работает достаточно хорошо.

person Prancer    schedule 26.09.2014
comment
Добавление этого сработает @JsonIgnoreProperties(ignoreUnknown = true) - person Puneet Jaiswal; 16.09.2016

Я новичок в Джексоне, но я думаю, что вы должны искать анализ дерева, как описано здесь

person letroll    schedule 21.03.2012