我正在尝试解析从上游出来的CSV文件。
CSV文件包含一些日期和编号字段,其格式是预先确定的。很少有实例,其中字段中的值不符合预期,我们希望将这些值读取为null,但Jackson-CSV解析器会抛出异常。
以下是我的例外
at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67) at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1535) at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:910) 在com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:523) 在com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:466) at com.fasterxml.jackson.databind.deser.std.DateDeserializers $ DateBasedDeserializer._parseDate(DateDeserializers.java:195) at com.fasterxml.jackson.databind.deser.std.DateDeserializers $ DateDeserializer.deserialize(DateDeserializers.java:285) at com.fasterxml.jackson.databind.deser.std.DateDeserializers $ DateDeserializer.deserialize(DateDeserializers.java:268) at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127) 在com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:287) 在com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151) 在com.fasterxml.jackson.databind.MappingIterator.nextValue(MappingIterator.java:277)
我也在Jackson CSVGithub页面上报告过相同的内容。 https://github.com/FasterXML/jackson-dataformat-csv/issues/153
答案 0 :(得分:0)
您可以尝试univocity-parsers,因为它可以处理日期/数字字段中的多种格式。例如:
public class MyClass {
@Format(formats = {"dd-MMM-yyyy", "yyyy-MM-dd"})
@Parsed
private Date date;
@Format(formats = {"$###,###.###", ""#0.00""})
@Parsed
private BigDecimal amount;
}
现在,如果没有格式与给定输入的内容兼容,您可以使用以下方法处理错误:
CsvParserSettings settings = new CsvParserSettings();
settings.detectFormatAutomatically(); //no need to configure format or anything.
parserSettings.setProcessorErrorHandler(new RetryableErrorHandler<ParsingContext>() {
@Override
public void handleError(DataProcessingException error, Object[] inputRow, ParsingContext context) {
if(error.getColumnName().equals("date")){
//if there's an error in the date column, assign a default and proceed with the record.
setDefaultValue(new Date());
} else {
//else keep the record anyway. Null will be used instead of the value you can't process.
keepRecord(); //if you don't call keepRecord() the entire row is discarded.
}
}
});
最后,您可以使用以下方法解析输入:
List<MyClass> myClassList = new CsvRoutines(parserSettings).parseAll(MyClass.class, input);
希望它有所帮助。
免责声明:我是这个图书馆的作者。它是开源和免费的(Apache 2.0许可证)