使用Smooks转换CSV为JSON时SAX处理大文件末尾多余逗号如何解决?
Smooks CSV转JSON末尾多余逗号解决方案(SAX大文件场景适配)
方案1:使用Smooks内置JSON序列化配置(优先推荐)
Smooks 1.6及以上版本自带的JSON序列化扩展可自动处理数组元素分隔符,无需手动控制逗号输出,配置示例如下:
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:csv="http://www.milyn.org/xsd/smooks/csv-1.5.xsd" xmlns:json="http://www.milyn.org/xsd/smooks/json-1.1.xsd"> <!-- 配置CSV解析规则 --> <csv:reader fields="field1,field2,field3" /> <!-- 配置JSON序列化,框架自动处理数组逗号 --> <json:serialization rootName="records" arrayElementName="csv_record" prettyPrint="false" /> </smooks-resource-list>
该配置会自动输出标准JSON数组,不会出现末尾多余逗号问题,同时支持SAX流处理大文件场景。
方案2:调整逗号输出逻辑(无需识别最后一条记录)
SAX流处理场景下无需判断最后一条记录,将「给每条记录末尾加逗号」的逻辑调整为给除第一条外的所有记录开头加逗号即可解决问题,实现逻辑如下:
- 初始化全局标识位
isFirstRecord = true,输出JSON数组起始符[ - 处理每条记录时:
- 如果是第一条记录,直接输出序列化后的JSON对象,将
isFirstRecord设为false - 如果非第一条记录,先输出逗号
,,再输出序列化后的JSON对象
- 如果是第一条记录,直接输出序列化后的JSON对象,将
- 所有记录处理完成后,输出JSON数组结束符
]
该方案完全适配SAX流处理,无需提前加载全量数据,内存占用稳定,适合GB级大文件转换场景。
方案3:输出流末尾冗余字符过滤
如果不想改动现有处理逻辑,可在输出层增加一层自定义Writer过滤器,自动替换末尾无效字符:
public class JsonArrayFixWriter extends FilterWriter { protected JsonArrayFixWriter(Writer out) { super(out); } @Override public void close() throws IOException { super.close(); // 扩展逻辑:读取输出缓冲区末尾2个字符,如果是",]"则替换为"]" // 字符串输出场景可直接做末尾替换:outputStr.replaceAll(",\\]$", "]") } }
该方案对上层转换逻辑无侵入,适合临时快速修复问题。
内容的提问来源于stack exchange,提问作者S317
相关产品推荐
相关产品推荐

