Десериализация Джексона Неожиданный токен (END_OBJECT), - PullRequest
4 голосов
/ 21 сентября 2011

Я пытаюсь десериализовать объект JSON в объект Java с помощью аннотации Джексона для одного класса Abstact "Animal":

@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)

Есть идеи, что случилось. Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2014

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

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

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

0 голосов
/ 21 марта 2012

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

...