Java Jackson:将csv文件解析为包含对象列表的对象

Dan*_*nF7 6 java csv jackson

我试图使用Jackson CsvParser将csv文件解析为一个对象,该对象还包含另一个类的列表.

因此前两列包含需要绑定到父类的数据,之后的数据需要绑定到另一个类.

public class Person {
    private String name;
    private String age;
    private List<CarDetails> carDetails;

    //Getters+setters
}

public class CarDetails {
    private String carMake;
    private String carRegistration;

    //Getters+setters
}
Run Code Online (Sandbox Code Playgroud)

要解析的日志如下所示:

John Doe, 30, Honda, D32GHF
Run Code Online (Sandbox Code Playgroud)

或者在另一个拥有2辆汽车的用户日志中,它可能看起来像:

Jane Doe, 29, Mini, F64RTZ, BMW, T56DFG 
Run Code Online (Sandbox Code Playgroud)

要将最初的2项数据解析为"Person"类是没有问题的.

CsvMapper mapper = new CsvMapper();
CsvSchema schema = CsvSchema.builder()
    .addColumn("name")
    .addColumn("age")

for(numberOfCars=2; numberOfCars!=0 ; numberOfCars--)
    schema = schema.rebuild()
        .addColumn("carMake")
        .addColumn("carRegistration")

MappingIterator<Map.Entry> it = mapper
    .reader(Person.class)
    .with(schema)
    .readValues(personLog);
    List<Person> people = new ArrayList<Person>();
    while (it.hasNextValue()) {
        Person person = (Person) it.nextValue();
        people.add(person);
    }
Run Code Online (Sandbox Code Playgroud)

但我不知道如何解析CarDetails.看起来我必须能够搜索值,创建一个新的CarDetails对象并将其添加到Person对象,但我看不到如何提取该信息.


我的解决方案如下:

List<Person> people = new ArrayList<Person>();

MappingIterator<Map<?,?>> it = mapper.reader(schema).withType(Map.class).readValues(personLog);
while(it.hasNextValue()) {
    Person person = new Person();
    CarDetails = new CarDetails();
    Map<?,?> result = it.nextValue();
    person.setName(result.get("name").toString());
    carDetails.setCarMake(result.get("carMake").toString());
    person.addCarDetails(carDetails);
    people.add(person);
}    
Run Code Online (Sandbox Code Playgroud)

Dav*_*ant 6

如果你看一下CavmapMap.readerWithSchemaFor的Javadoc ,它会说:

没有CSV类型可以映射到数组或集合