Java SuperCSV-将多个列解析为一个列表

Java SuperCSV-将多个列解析为一个列表,java,csv,supercsv,Java,Csv,Supercsv,给定以下示例csv数据 姓名、地址、兄弟姐妹、兄弟姐妹、兄弟姐妹 约翰、梅斯特、莎拉、迈克、格雷格 还有我想要解析数据的示例POJO public class Employee { private String name; private String address; private List<String> siblings; public Employee() { } public void setName(String name) { .

给定以下示例csv数据

姓名、地址、兄弟姐妹、兄弟姐妹、兄弟姐妹
约翰、梅斯特、莎拉、迈克、格雷格

还有我想要解析数据的示例POJO

public class Employee {
   private String name;
   private String address;
   private List<String> siblings;

   public Employee() { }  

   public void setName(String name) { ... }
   public void setAddress(String address { ... }
   public void setSiblings(List<String> siblings) { ... }
}
以及以下单元处理器

CellProcessors[] processors = new CellProcessors[]{
    new NotNull(),    // name
    new NotNull(),    // address
    new NotNull(),    // siblings[0]
    new NotNull(),    // siblings[1]
    new NotNull()     // siblings[2]
}
我希望能够毫无问题地将csv数据解析为
Employee
,但是我收到以下异常

org.supercsv.exception.SuperCsvReflectionException:在com.Employee类中找不到方法setSiblings[0](java.lang.String)-检查相应的nameMapping元素是否与bean中的字段名匹配,并且单元处理器返回与字段兼容的类型

这就是我进行实际解析的方式

List<Employee> deserializedRecords = new ArrayList<>();
try (ICsvBeanReader beanReader = new CsvBeanReader(new FileReader(file), CsvPreferences.STANDARD_PREFERENCE)) {
    beanReader.getHeader(true);
    Employee model;
    while ((model = (Employee) beanReader.read(Employee.class, fieldMapping, processors)) != null) {
        deserializedRecords.add(model);
    }
}
List反序列化记录=new ArrayList();
try(ICsvBeanReader beanReader=new CsvBeanReader(new FileReader(file),CsvPreferences.STANDARD_首选项)){
beanReader.getHeader(true);
员工模式;
而((model=(Employee)beanReader.read(Employee.class,fieldMapping,processors))!=null){
反序列化记录。添加(模型);
}
}

这在很大程度上遵循了给出的答案,在阅读SuperCSV文档之后,我不完全确定引发异常的原因。

您使用的是不支持索引(或深度)映射的
CsvBeanReader
。您正在寻找
CsvDozerBeanReader
(示例)

List<Employee> deserializedRecords = new ArrayList<>();
try (ICsvBeanReader beanReader = new CsvBeanReader(new FileReader(file), CsvPreferences.STANDARD_PREFERENCE)) {
    beanReader.getHeader(true);
    Employee model;
    while ((model = (Employee) beanReader.read(Employee.class, fieldMapping, processors)) != null) {
        deserializedRecords.add(model);
    }
}