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

时间:2019-02-18 20:30:31

标签: java csv jackson jackson-dataformat-csv

我正在使用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或Sheets等可能执行的公式或其他内容。例如,如果某个值以@=开头,那么我可能会在该值之前加上'字符以防止执行。

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

1 个答案:

答案 0 :(得分:2)

CsvGeneratorCsvEncoder都执行了处理CSV输出值的工作,它们似乎都未包含回调选项。因此,我认为杰克逊无法实现这个目标。

但是,当然,可以通过其他方法解决此任务。

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

  • 如果pojo是紧凑的并且要处理的字段是众所周知的,则创建一个方法,该方法期望将pojo的相应getter和setter的引用作为args调用,调用getter来获取值,对其进行清理并设置清洁价值。遍历pojoCollection来处理它们。

  • 如果字符串字段很多并且pojo是不同类型,并且都需要清除,则使用反射来大规模处理所有String字段。

但是,如果您不受使用杰克逊的限制,则可以使用某些库来使用回调。例如,在Univocity parsers中,ObjectRowWriterProcessor可以结合多种转换可能性来实现。