Десериализация Джексона не удалась с картой

Я создал простой тестовый пример, который показывает ошибку. Пожалуйста, дайте мне знать, если я что-то пропустил.

У меня есть простой интерфейс, который объявляет один метод доступа:

public class JacksonParsingTest {
    public interface EventWithMap {
        Map<String, String> getContextMap();
    }

    @Test
    public void testJsonMapDeserializes()
        throws JsonParseException, JsonMappingException, IOException
    {
        String json = "{\"contextMap\":[" +
                  "{\"key\":\"processedAt\",\"value\":\"Thu Dec 31 14:30:51 EST 2015\"}" +
                  "]}";

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule( new MrBeanModule() );
        EventWithMap e = mapper.readValue( json, EventWithMap.class );

        assertEquals( "Thu Dec 31 14:30:51 EST 2015", e.getContextMap().get( "processedAt" ) );
    }
}

Когда я запускаю этот модульный тест, Джексон не может выполнить синтаксический анализ строки json:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token
at [Source: {"contextMap":[{"key":"processedAt","value":"Thu Dec 31 14:30:51 EST 2015"}]}; line: 1, column: 2] (through reference chain: RecoveryEventBuilderTest$EventWithMap["contextMap"])

Как вы можете видеть из трассировки стека, Джексон правильно извлекает токен contextMap из json, но не может продолжать токенизацию строки. Насколько я знаю, строка json правильно представляет карту.

Спасибо, Робин.

1 ответ

Как отмечали другие, проблема в том, что рассматриваемый JSON структурно несовместим с POJO: существует такая ненужная дополнительная оболочка Array.

Но есть способ справиться с этим конкретным случаем: если вы включите DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYSВы должны быть в состоянии получить преобразование для конкретного случая, когда массив имеет одно И ТОЛЬКО ОДНО значение в нем.

Другие вопросы по тегам