2015-06-11 42 views
5

我使用Jackson CSV將CSV文件解析爲POJO。我的問題是,如果CSV中的一行的列數太少,解析器不會發出抱怨,而只是將其餘字段設置爲空。傑克遜CSV缺失列

解析代碼:

CsvMapper csvMapper = new CsvMapper(); 
    csvMapper.addMixInAnnotations(Person.class, PersonCsvMixin.class); 
    CsvSchema schema = csvMapper.schemaFor(Person.class).withHeader(); 
    MappingIterator<Person> it = csvMapper.reader(dataClass).with(schema).readValues(csv); 
    LinkedList<Person> output = new LinkedList<>(); 

    while(it.hasNext()) { 
     output.push(it.next()); 
    } 

密新:

import com.fasterxml.jackson.annotation.*; 

@JsonPropertyOrder(value = { "FirstName", "LastName", "Title"}) 
public abstract class Person { 
    @JsonProperty("LastName") 
    public abstract String getLastName(); 
    @JsonProperty("FirstName") 
    public abstract String getFirstName(); 
    @JsonProperty("Title") 
    public abstract String getTitle(); 
} 

數據類:

public class OfficespaceInputEmployee implements Serializable{ 
    protected String firstName; 
    protected String lastName; 
    protected String title; 
    // .. getters and setters 
} 

如果我解析文件類似下面的,不會發生錯誤,即使中間記錄缺少兩個字段。相反,姓氏和職務成爲null

"FirstName", "LastName", "Title" 
"John", "Smith", "Mr" 
"Mary" 
"Peter", "Jones", "Dr" 

有一個特點,使這將導致這種情況,而不是錯誤?

+0

顯示您的MappingIterator用法。 –

+0

@LaurentiuL。添加了MappingIterator用法 – rewolf

回答

3

你可以自己拋出一個異常,當你構建輸出LinkedList的內部 while循環:

while(it.hasNext()) { 
    Person line = it.next(); 
    //call a method which checks that all values have been set 
    if (thatMethodReturnsTrue){ 
     output.push(line); 
    } else{ 
     throw SomeException(); 
    } 
} 
+1

是的,謝謝。我知道我可以做到這一點,但我希望圖書館能夠在分析時真正檢查這一點,就像在田地太多時一樣。 – rewolf

+0

我還沒有找到任何可以傳遞的解析器的選項。我認爲可能不會有一個 –

+1

@rewolf會有用CsvParser.Feature,你可以在CsvMapper上啓用它。你可以在github上添加一個建議 –

2

我建議提交的問題跟蹤的RFE,對於像CsvParser.Feature.REQUIRE_ALL_COLUMNS:如果啓用,解析器會拋出指示缺少一個或多個預期列的例外。 這聽起來像是對我有用的補充。

+1

在Github上創建問題https://github.com/FasterXML/jackson-dataformat-csv/issues/113 – rewolf