配置 CsvMapper 以检查写入的每个值

Configure CsvMapper to Inspect Each Value Written

我正在使用 jackson-dataformat-csv 将 POJO 集合导出为 CSV,如下所示:

CsvSchema.Builder schemaBuilder = CsvSchema.builder()
  .addColumn("id")
  .addColumn("name")
  etc...
CsvSchema schema = schemaBuilder.build().withHeader();
CsvMapper mapper = new CsvMapper();
mapper.enable(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS);
String csv = mapper.writer(schema).writeValueAsString(pojoCollection);

我想在将每个字段值写入 CSV 之前对其进行检查,并有选择地修改该值以防止 Excel、表格等可能执行的公式或其他内容。例如,如果一个值以 @= 开头,那么我可能会在该值前面加上 ' 字符以防止执行。

如何配置 CsvMapper 以便为写入 CSV 的每个值获得回调?

执行 CSV 输出值处理作业的 CsvGenerator and CsvEncoder 似乎都不包含回调选项。所以我认为jackson是达不到这个目标的。

当然,这个任务也可以通过其他途径解决。

在不使用其他库的情况下,pojoCollection 可以进行预处理以清理字符串字段。不知道这些 pojo 的实际结构,选择可能是:

  • 如果 pojo 是紧凑的并且要处理的字段是众所周知的,则创建一个方法,该方法期望引用 pojo 各自的 getter 和 setter 作为参数,调用getter 检索值,对其进行清理并设置干净的值。循环 pojoCollection 来处理它们。

  • 如果string字段较多,pojo类型不同,都需要清洗,使用反射海量处理所有String字段

但是,如果您不受限于使用 jackson,则有些库提供了使用回调的可能性。例如,在 Univocity parsers, ObjectRowWriterProcessor 中允许结合多种转换可能性来实现它。