Jakson JSON как использовать дженерики?

113
11 февраля 2021, 14:40

Хочу сделать так, чтоб этот метод «convertResponceInObjects» работал с разными объектами, но не получается

Идея подсвечивает эту «T[].class)));» часть кода, но как её заменить не знаю, гугление не помогает

Помогите пож-та заставить этот код работать

p.s. если убрать "T" и подставить объект, все работает норм

import by.bestproger.project.contextgoogle.yandex.entity.group.GroupData;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Util {
    public static void main(String[] args) throws IOException {
        List <String> response = new ArrayList<>();
        response.add("{\"result\":{\"AdGroups\":[{\"Id\":3489546459,\"Name\":\"Optliner v1\",\"CampaignId\":37272735},{\"Id\":3813193305,\"Name\":\"Optliner v1 (копия)\",\"CampaignId\":43122041}]}}");
        List<GroupData> groupListTest = Util.convertResponceInObjects(response);
    }
    public static <T> List convertResponceInObjects(List<String> responceYandex) throws IOException {
        List<T> myObjects = new ArrayList<>();
        for (String el : responceYandex) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = mapper.readTree(el).get("result").get("AdGroups");
            try {
                List<T> temp = (Arrays.asList(mapper.readValue(node.toString(), T[].class)));
                for (T elTemp : temp) {
                    myObjects.add(elTemp);
                }
            } catch (Exception e) {
                System.out.println("Метод convertResponceInObjects, ошибка (нужно положить в логи) " + e);
            }
        }
        return myObjects;
    }
}
Answer 1

Само собой идея будет подсвечивать. Для этих целей есть специальный абстрактный класс com.fasterxml.jackson.core.type.TypeReference.

Используйте его вместо вашего

T[].class

вот так:

List<T> temp = (Arrays.asList(mapper.readValue(node.toString(), new TypeReference<List<T>>() {})));
READ ALSO
Проверка на наличие сразу двух классов

Проверка на наличие сразу двух классов

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

108
ассинхронная загрузка

ассинхронная загрузка

у меня есть страница последовательной загрузки скриптов за генерацию нужной страницы отвечают несколько скриптов сейчас есть проблема...

93
Как перебрать api в компоненте React&#39;a?

Как перебрать api в компоненте React'a?

Мне нужно пройтись циклом по компоненту Authors и возвратить

135
URL валидация regex

URL валидация regex

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

125