杰克逊CSV缺少列

rew*_*olf 6 java csv parsing jackson

我正在使用Jackson CSV将CSV文件解析为POJO.我的问题是,如果CSV中的行包含的列太少,解析器就不会抱怨,只是将其余字段设置为null.

解析代码:

    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());
    }
Run Code Online (Sandbox Code Playgroud)

混入:

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();
}
Run Code Online (Sandbox Code Playgroud)

数据类:

public class OfficespaceInputEmployee implements Serializable{
    protected String firstName;
    protected String lastName;
    protected String title;
    // .. getters and setters
}
Run Code Online (Sandbox Code Playgroud)

如果我解析如下文件,即使中间记录缺少两个字段,也不会发生错误.相反,LastName和Title成为null

"FirstName", "LastName", "Title"
"John", "Smith", "Mr"
"Mary"
"Peter", "Jones", "Dr"
Run Code Online (Sandbox Code Playgroud)

是否有启用此功能会导致此错误的功能?

Kar*_*ila 7

我知道这是一个旧线程,但是当我自己遇到同样的问题时,让我分享解决方案:

csvMapper.configure(CsvParser.Feature.FAIL_ON_MISSING_COLUMNS, true); 会做的伎俩。


Lau*_* L. 3

当您在 while 循环内构建输出 LinkedList 时,您可以自己抛出异常:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对了谢谢。我知道我可以做到这一点,但我希望库能够在解析时实际检查这一点,就像字段太多时那样。 (2认同)