Моим вариантом было написать универсальный трансформатор CSV, который должен иметь возможность конвертировать любую строку Java POJO в CSV.Написание генерического трансформатора POJO на CSV
Моя реализация:
public <T> List<String> convertToString(List<T> objectList) {
List<String> stringList = new ArrayList<>();
char delimiter = ',';
char quote = '"';
String lineSep = "\n";
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(!HOW_TO!);
for (T object : objectList) {
try {
String csv = mapper.writer(schema
.withColumnSeparator(delimiter)
.withQuoteChar(quote)
.withLineSeparator(lineSep)).writeValueAsString(object);
} catch (JsonProcessingException e) {
System.out.println(e);
}
}
return stringList;
}
Я использовал Джексон-DataFormat-Csv библиотеку, но я застрял с HOW_TO! part, ie Как извлечь .класс объекта из objectList. Я учился и наткнулся на Type Erasure. Поэтому я думаю, что это не так просто, как дать параметр .class в качестве моей функции. Но я также извлекаю этот список объектов из общего объекта с использованием Java Reflection, поэтому у меня нет возможности предоставить параметры .class.
Есть ли обходной путь для этого?
ИЛИ
Любые другие подходы/библиотеки, где я могу преобразовать общий List<T> objectList to List<String> csvList
с функциональностью добавления разделителей, кавычки, линейные разделители и т.д.
Спасибо!
И если первый элемент списка является подклассом, не разделяемым другими элементами списка? –
Это не важно. Это список, он известен в списке, так как это суперкласс. Если ему понадобился обработчик для обработки подклассов, решение будет таким же простым.Просто заново создайте схему в цикле for и сделайте один и тот же getClass для каждого элемента. В своем примере он установил свою схему из цикла, поэтому я предположил, что все элементы списка должны обрабатываться одинаково. Поэтому нет необходимости в особых случаях –
Да, это имеет значение. Учитывая «Список», желая обрабатывать все элементы одинаково, «Class» необходим «MyBaseClass». Но если элемент нуль указывает на экземпляр, тип выполнения которого является 'SubclassA', тогда ваш метод убедит его, что у него есть« Список », и он быстро попадет в неприятности, если все остальные экземпляры также не относятся к этому подкласс. Ваше утверждение «известно по списку как суперкласс» неверно. Тип ссылки в списке - «Объект»; тип среды выполнения является фактическим типом подкласса. Он известен только как базовый класс во время компиляции. –