You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:00:27