如何使用Jackson库的CsvMapper为POJO的数值类型字段添加双引号
解决方案
你当前使用的CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS配置仅对字符串类型字段生效,数值类型默认不会触发该规则,可通过以下几种方式实现需求:
方案1:全局配置强制所有字段加引号(推荐,Jackson 2.10+版本支持)
直接开启CsvGenerator.Feature.ALWAYS_QUOTE_ALL_VALUES配置即可,修改你的CsvMapper配置部分:
final CsvMapper csvMapper = new CsvMapper(); csvMapper.configure(CsvGenerator.Feature.ALWAYS_QUOTE_ALL_VALUES, true); final CsvSchema schema = csvMapper.schemaFor(Pojo.class).withoutHeader().withQuoteChar(CsvSchema.DEFAULT_QUOTE_CHAR); final ObjectWriter ow = csvMapper.writer(schema); System.out.println(ow.writeValueAsString(pojo));
修改后输出就会符合预期的"Peter","22"。
方案2:针对指定数值字段单独配置
如果你的Jackson版本低于2.10,没有上述全局配置,可以给POJO的数值字段加上@JsonFormat注解,强制序列化为字符串类型:
public class Pojo{ public String name; @JsonFormat(shape = JsonFormat.Shape.STRING) public int age; }
配合你原来的ALWAYS_QUOTE_STRINGS配置,数值字段会先被序列化为字符串,之后就会自动加上双引号。
方案3:手动指定CsvSchema所有列为字符串类型
你也可以手动构建CsvSchema,把所有字段的类型都显式指定为STRING,输出时所有字段都会按照字符串规则处理加引号:
final CsvSchema schema = CsvSchema.builder() .addColumn("name", CsvSchema.ColumnType.STRING) .addColumn("age", CsvSchema.ColumnType.STRING) .withoutHeader() .withQuoteChar(CsvSchema.DEFAULT_QUOTE_CHAR) .build();
内容的提问来源于stack exchange,提问作者Felipe Tapia
相关产品推荐
相关产品推荐

