6

Jackson CsvParser を使用して csv ファイルを解析して、別のクラスのリストも含むオブジェクトにしようとしています。

したがって、最初の 2 列には親クラスにバインドする必要があるデータが含まれ、その後のデータは別のクラスにバインドする必要があります。

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
}

解析されるログは次のようになります。

John Doe, 30, Honda, D32GHF

または、2 台の車を所有するユーザーの別のログでは、次のようになります。

Jane Doe, 29, Mini, F64RTZ, BMW, T56DFG 

データの最初の 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);
    }

しかし、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);
}    
4

1 に答える 1

6

CsvMapper.readerWithSchemaForの Javadoc を見ると、次のように記載されています。

配列またはコレクションにマップできる CSV タイプはありません

于 2012-09-26T14:19:16.670 に答える