BeanIO 如何配置模板读取CSV内竖线分隔的嵌套对象集合
BeanIO 嵌套分隔字段的正确配置
原配置不生效的本质问题
- 全局解析器未配置双引号内容识别规则:默认情况下BeanIO不会识别双引号的包裹边界,会把field4字段引号内的分号当成主记录的字段分隔符,直接把整段field4拆成多个独立主字段,挤掉后续field5、field6的字段位置,造成全局错位
- 集合型segment没有配置独立的分隔规则:默认继承主记录的分号分隔符,完全无法识别竖线作为多个子对象的拆分边界,自然读不到正确的集合内容
可直接落地的配置调整
整个流使用分隔符解析格式,核心是给嵌套集合段配置两级独立的拆分逻辑,不需要额外把field4先读成原始字符串再二次转换:
<stream name="csvParser" format="delimited"> <!-- 主解析器规则适配 --> <parser> <property name="delimiter" value=";"/> <property name="quoting" value="true"/> <property name="quote" value="\""/> <property name="escape" value="\""/> </parser> <record name="mainRecord" class="br.com.beanio.MyPojo"> <field name="field1"/> <field name="field2"/> <field name="field3"/> <!-- 对应第4个主字段的集合段配置 --> <segment name="fields4" collection="list" class="br.com.beanio.MySubPojo" minOccurs="0" > <!-- 核心配置:定义segment独立的两级拆分规则 --> <segment-collection> <!-- 第一级拆分:竖线分隔多个子对象 --> <property name="delimiter" value="|"/> <!-- 第二级拆分:单个子对象内部用分号拆属性 --> <property name="elementDelimiter" value=";"/> </segment-collection> <field name="field4-1"/> <field name="field4-2"/> </segment> <field name="field5"/> <field name="field6"/> </record> </stream>
避坑要点
- 不需要在主记录层级单独增加读取原始field4字符串的占位字段,当前声明的segment本身就占据主记录第4个字段的顺序位置,BeanIO会自动和前后字段对齐,不会出现偏移
- 集合解析为空时优先检查parser的
quoting配置:未开启该属性时,双引号包裹的内容不会被当成单个整体字段,内部的所有分隔符都会触发拆分校验 - 不要随意给segment指定
position属性,严格按照XML中字段的声明顺序对齐主记录的字段序列即可
内容的提问来源于stack exchange,提问作者Guilherme Bernardi
相关产品推荐
相关产品推荐

