我使用Jackson CSV将CSV文件解析为POJO。我的问题是,如果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
}
如果我解析如下文件,即使中间记录缺少两个字段,也不会发生错误。相反,LastName和Title变为null
"FirstName", "LastName", "Title"
"John", "Smith", "Mr"
"Mary"
"Peter", "Jones", "Dr"
是否有启用此功能会导致错误的功能?
答案 0 :(得分: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 :(得分:2)
我建议为问题跟踪器提交RFE,例如CsvParser.Feature.REQUIRE_ALL_COLUMNS
:如果启用,解析器将抛出异常以指示缺少一个或多个预期列。
这对我来说听起来很有用。
答案 2 :(得分:1)
我知道这是一个旧线程,但是当我自己遇到相同的问题时,让我分享解决方案:
csvMapper.configure(CsvParser.Feature.FAIL_ON_MISSING_COLUMNS,true); 可以解决问题。