#java #spring-boot #jackson
Вопрос:
Я пытаюсь десериализовать хэш-карту с помощью Джексона. Моя структура данных такова
public class FilterDto {
private Map<String, List<String>> sectorFilter;
public FilterDto() {}
public Map<String, List<String>> getSectorFilter() {
return sectorFilter;
}
public void setSectorFilter(Map<String, List<String>> sectorFilter) {
this.sectorFilter = sectorFilter;
}
}
Мое тело запроса-это
{
"sectorFilter": [
{
"ab": [
"abc",
"cde"
]
}
]
}
Когда я попытался десериализовать это, я получил
Cannot deserialize instance of `java.util.Map<java.lang.String,java.util.List<java.lang.String>>` out of START_ARRAY token
Поэтому я попытался использовать пользовательский десериализатор, чтобы посмотреть, сработает ли он. Я создал пользовательский deerialzer, как показано ниже
public class FilterDeserializer extends StdDeserializer<Map<String,List<String>>> {
public FilterDeserializer(StdDeserializer<?> src) {
super(src);
}
@Override
public Map<String,List<String>> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
}
}
и добавил его в свой dto
@JsonDeserialize(using = FilterDeserializer.class)
private Map<String, List<String>> sectorFilter;
но теперь я получаю
No qualifying bean of type 'com.fasterxml.jackson.databind.deser.std.StdDeserializer<?>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
есть идеи, как я могу получить эту работу ? Спасибо
Комментарии:
1. измените свой «Фильтр секторов» в запросе на объект(начинайте и заканчивайте с {} не []) или, если это массив, вы должны изменить «Карта<Строка, список<Строка><Строка>>» на список карты «Список<Строка>><Карта<Строка, список<Строка><Строка>><Строка>>»
2. @Dilantha, пожалуйста, подумайте о том, чтобы проголосовать и принять приведенный ниже ответ, чтобы вопрос можно было «закрыть» и другие могли извлечь из него пользу 😉 Спасибо!
Ответ №1:
sectorFilter
как вы показали , это не карта, а массив объектов JSON. Попробуйте десериализоваться как List<Map<String, List<String>>>
. Конечно, вы также можете создавать классы, имитирующие эту структуру, если хотите.