1 回答

TA貢獻1871條經驗 獲得超8個贊
整個技巧是啟用CsvGenerator.Feature.STRICT_CHECK_FOR_QUOTING功能。來自文檔:
確定在確定列值需要引用之前完成多少工作的功能:當設置為 true 時,將進行全面檢查以僅在絕對必要時使用引用;但當為 false 時,會進行更快但更保守的檢查,并且可能對可能不需要的值使用引號。權衡基本上是在最佳/最小引用(true)和更快的處理(false)之間。更快的檢查涉及僅檢查值的前 N 個字符,以及可能的更寬松的檢查。
但請注意,無論設置如何,所有需要引用的值都將是:只是當設置為 false 時,還可以引用其他值(以避免必須進行更昂貴的檢查)。
對于“寬松”(近似、保守)檢查,默認值為 false。
您可以刪除模式和映射器的所有其他配置,并且它將以相同的方式工作。您可以將其簡化為以下代碼:
class CsvEntityGenerator {
? ? private final CsvMapper mapper;
? ? private final CsvSchema schema;
? ? public CsvEntityGenerator(Class clazz) {
? ? ? ? mapper = new CsvMapper();
? ? ? ? mapper.enable(CsvGenerator.Feature.STRICT_CHECK_FOR_QUOTING);
? ? ? ? schema = mapper.schemaFor(clazz).withNullValue("");
? ? }
? ? public String toCsvString(Object entity) throws IOException {
? ? ? ? return mapper.writer(schema).writeValueAsString(entity);
? ? }
}
以及簡單的用法:
CsvEntityGenerator gen = new CsvEntityGenerator(EntityCsvRecord.class);
System.out.print(gen.toCsvString(new EntityCsvRecord("Na,me")));
System.out.print(gen.toCsvString(new EntityCsvRecord(null)));
System.out.print(gen.toCsvString(new EntityCsvRecord("Name")));
印刷:
8b572b1b-17c1-429d-887b-ec9af1c30d05,"Na,me",SOMETHING,123456,www.some.url
e86eacb1-d45e-4614-91bb-45f0d8840ea9,,SOMETHING,123456,www.some.url
e9627c32-6736-44a5-8eb2-7d153f86af20,Name,SOMETHING,123456,www.some.url
正如您所看到的,我們只創建一次CsvMapper并且CsvSchema當我們想要序列化實體時重用它。這是更快的方法。
添加回答
舉報