2012-09-26 18 views
5

我想解析一個使用Jackson CsvParser的csv文件到一個也包含另一個類的列表的對象中。Java傑克遜:解析一個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

如果你看的Javadoc CsvMapper.readerWithSchemaFor,它指出:

沒有CSV類型可以映射到數組或集合

+1

是的,它似乎沒有一個乾淨的方式來做到這一點。然而,在此期間,我決定只將所有內容轉儲到映射中,並使用模式來識別鍵並手動填充類。希望有更好的方法。感謝您的輸入。 (我將發佈我的解決方案作爲更新並接受您的答案)。 – DanF7

+0

請注意,如果您添加自定義序列化器和反序列化器,則可以執行此類轉換。你甚至可以爲此使用標準的JSON ObjectMapper。 – StaxMan

+1

對於更高版本(2.5及更高版本),Jackson實際上支持簡單的List /數組類型,其中值是標量,枚舉或數字等標量。分隔符默認爲分號(「;」),但可以配置爲其他字符。這不會遺憾地適用於你的情況,因爲你正在使用與列相同的分隔符;而價值類型也更復雜。但我認爲值得一提的是,如果其他人正在尋找更簡單的List /數組使用。 – StaxMan