Преобразование строки в класс pojo с использованием исключения opencv - PullRequest
1 голос
/ 12 июля 2020

Мне нужно преобразовать свой HTTP-ответ в Модель, и мой ответ имеет простой формат csv:

try {
    StringReader stringReader = new StringReader(string);
    CSVReader csvReader = new CSVReaderBuilder(stringReader).build();

    CsvToBean<SampleModel> csvToBean = new CsvToBeanBuilder<SampleModel>(csvReader)
            .withType(SampleModel.class)
            .withIgnoreLeadingWhiteSpace(true)
            .build();
    arrayList =(ArrayList<SampleModel>)csvToBean.parse();
} catch (Exception e) {
    System.out.println(e.getMessage());
}

Это вызывает исключение:

Ошибка при захвате заголовка CSV!

Строка выглядит так:

Name, Date
Alex, 2012-10-30
Borhan, 2012-11-05

Я слежу за работой отсюда: https://sourceforge.net/p/opencsv/bugs/196/#ee18

1 Ответ

1 голос
/ 13 июля 2020

Если у вас есть один или несколько конструкторов с аргументами, создайте конструктор без аргументов явно в классе bean-компонента. Если у вас нет одного или нескольких конструкторов с аргументами, вам не нужно явно создавать конструктор без аргументов.

SampleModel. java:

import com.opencsv.bean.CsvBindByName;

public class SampleModel {
    @CsvBindByName(column = "Name")
    private String name;

    @CsvBindByName(column = "Date")
    private String date;

    public SampleModel() {
        // Empty
    }

    public SampleModel(String name, String date) {
        this.name = name;
        this.date = date;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDate(String date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "{" + name + ", " + date + "}";
    }
}

Как видите, у меня есть конструктор с двумя аргументами, поэтому мне нужно явно указать конструктор без аргументов. Если вы удалите конструктор без аргументов и запустите Main.java (приведено ниже), он завершится ошибкой во время выполнения.

Однако следующее определение bean-компонента не требует явного конструктора без аргументов. Вы можете проверить это, снова запустив Main.java с этим определением.

import com.opencsv.bean.CsvBindByName;

public class SampleModel {
    @CsvBindByName(column = "Name")
    private String name;

    @CsvBindByName(column = "Date")
    private String date;

    public void setName(String name) {
        this.name = name;
    }

    public void setDate(String date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "{" + name + ", " + date + "}";
    }
}

Main. java:

import java.io.StringReader;
import java.util.List;

import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import com.opencsv.bean.CsvToBeanBuilder;

public class Main {
    public static void main(String[] args) {
        String string = "Name, Date\n" + 
                        "Alex, 2012-10-30\n" + 
                        "Borhan, 2012-11-05";

        try {
            StringReader stringReader = new StringReader(string);
            CSVReader csvReader = new CSVReaderBuilder(stringReader).build();
            List<SampleModel> arrayList= new CsvToBeanBuilder<SampleModel>(csvReader)
                                    .withType(SampleModel.class)
                                    .withIgnoreLeadingWhiteSpace(true)
                                    .withSkipLines(1)// Skip the header line
                                    .build()
                                    .parse();
            System.out.println(arrayList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Вывод:

[{Alex,  2012-10-30}, {Borhan,  2012-11-05}]

Исходный ответ:

Обходной путь - создать экземпляр bean-компонента из каждой записи, которую вы читаете из CSV, и добавить этот экземпляр в List, как показано ниже:

List<SampleModel> arrayList = new ArrayList<>();
String[] nextRecord;
CSVReader csvReader = new CSVReaderBuilder(stringReader)
                        .withSkipLines(1)// Skip the header line
                        .build();

while ((nextRecord = csvReader.readNext()) != null) {
    arrayList.add(new SampleModel(nextRecord[0], nextRecord[1]));
}
...