OpenCSV 5.9:如何配置CsvToBeanBuilder将空字符串转为POJO的null值
解决OpenCSV 5.9将CSV空字符串转为POJO null值的问题
你遇到的核心问题是:直接传入手动创建的CSVReader实例时,CsvToBeanBuilder的withFieldAsNull配置不会作用到这个已有的CSVReader上。OpenCSV规定,当自行传入CSVReader时,其配置优先级高于CsvToBeanBuilder的全局设置,因此需要调整CSVReader的创建方式,确保空字符串转null的规则生效。
解决方案一:让CsvToBeanBuilder自行创建CSVReader
直接将InputStreamReader传入CsvToBeanBuilder,而非手动创建CSVReader,这样withFieldAsNull的配置会被应用到内部创建的CSVReader上:
@Override public List<Person> parse(InputStream inputStream) { log.debug("Parsing InputStream as CSV"); return new CsvToBeanBuilder<Person>(new InputStreamReader(inputStream)) .withType(Person.class) .withSeparator(',') .withIgnoreLeadingWhiteSpace(true) .withIgnoreEmptyLine(true) .withFieldAsNull(CSVReaderNullFieldIndicator.BOTH) .build() .parse(); }
解决方案二:手动配置CSVReader的空字段指示符
如果需要自定义CSVReader的其他配置,可以使用CSVReaderBuilder构建CSVReader并显式设置空字段转null的规则:
@Override public List<Person> parse(InputStream inputStream) { log.debug("Parsing InputStream as CSV"); CSVReader csvReader = new CSVReaderBuilder(new InputStreamReader(inputStream)) .withFieldAsNull(CSVReaderNullFieldIndicator.BOTH) .withIgnoreLeadingWhiteSpace(true) .build(); return new CsvToBeanBuilder<Person>(csvReader) .withType(Person.class) .withSeparator(',') .withIgnoreEmptyLine(true) .build() .parse(); }
验证效果
修改后,CSV中"Bob",""这一行的lastName字段会被正确解析为null,而非空字符串。
内容的提问来源于stack exchange,提问作者Larry
相关产品推荐
相关产品推荐

