前言:
当我使用 com.csvreader.CsvWriter 对 .csv 后缀格式文件内容进行写入时,发现所有带有 字符串 内容的字段信息都会默认加上转义字符. 文件生成后,输出的结果不是我想要的内容. 百度了很久都没有找到关于使用 CsvWriter 类时对字符串内容怎么解决转义的情况.当然也可能是检索的标题不太对吧. 故自己重新出了一个小的使用教程对这个问题进行解决
A. 需求描述:
需要对文件中的内容解析并且对经过 Base64 加密后的 extendField 字段内容进行解码,得到明文信息后再重新生成一份 .csv 后缀格式的文件或者是做具体的业务处理
文档编辑器的阅览效果:
WPS的文件内容阅览效果:
B. 问题描述:
当我对文件内容的 extendField 加密字段进行解码后,拿到的是一个JSON的字符串内容,样例如下
{"repayOccupyFee":200}
从上面的内容可以看出,此时解析为明文的内容就是一个很正常的JSON并且是符合JSON格式规范的.
当我使用 com.csvreader.CsvWriter 类对解析后的所有文件内容进行相应业务处理后,重新生成 .csv 后缀格式的文件. 所有的字符串内容会默认进行转义的处理.如上面JSON串的内容会变成
{""repayOccupyFee"":200}
这时问题来了,这样默认的转义肯定不是我所需要的内容,也不是一个正常的JSON内容了.从上面的例子可以看出 CsvWriter 类对所有的字符串对象或者是有字符串等特定标识符的都会进行默认添加转义, 如 " 与 ' 这种符号,会加 /" 与 /' 的处理.
当你本来就是需要一个很正常的JSON串内容体时,这样转义后的数据,JSON串中的 K值根本转不成 json 对象
C. 问题解决:
后来通过多次的调试与查看 com.csvreader.CsvWriter 类的源码,发现有一个参数可以解决生成文件时不对字符串内容进行默认添加转义的处理.从而保障了文件成时JSON中内容不会乱加引号的情况
//创建文件csvWriter = new CsvWriter(targetFilePath, LINE_VERTIACAL_BAR, Charset.forName(FILE_ENCODING_UTF8));//开启字符串内容无需转义的参数csvWriter.setUseTextQualifier(false);//先写文件头csvWriter.writeRecord(headers);//写文件内容for (ReconciliationDataDetailModel detail : dataList) {String[] csvContent = getDecodeValuesFromObject(detail, headers);csvWriter.writeRecord(csvContent);}
csvWriter.setUseTextQualifier(false) 这个属性参数在源码里面默认为true , 只有你在写文件时设置为 false 才会不对字符串内容进行转义的处理.
提示:
1. 使用这个参数时需要注意若是你的字段内容本来就是要保持字符串输出的话,需要自己手动加上引号. 因为生成文件时,字段默认会去掉 引号 内容来进行写入的 ; 如 "helloword" 的String类型对象内容写成文件时为 helloword ; 当你想保留字符的标识号,写成 "helloword" 来输出的文件中, 就要手动添加 " 号
2. 如你是一个String类型的JSON串内容,使用这个参数时就会很好用,妥善的解决JSON串中K值多加了 " 号的情况 ; 也不需要象其它网上的什么乱七八糟的教程版本去搞什么字符的特殊处理