Jackson CSV无法默认按分号解析List<String>的问题咨询
Jackson CSV 列表字段解析问题解答
核心结论
Jackson CSV默认不支持自动按分号分隔解析List类型字段,你遇到的情况是正常行为——Jackson CSV默认会将CSV列的完整内容当作单个字符串处理,不会主动拆分字段内的分隔符。
原因说明
CSV格式的核心是用逗号分隔不同列,Jackson CSV的默认解析逻辑仅关注列与列之间的分隔(逗号),对列内容内部的任何字符(包括分号)都会当作普通文本处理。你配置DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY只是让单个字符串能被包装成List,但不会对字符串本身做拆分操作,因此得到的List只会包含一个完整的字符串元素。
解决方案
要实现按分号拆分列内容为List<String>,可以通过以下两种方式实现:
1. 自定义反序列化器
编写一个针对List<String>的反序列化器,专门处理分号拆分逻辑,然后通过注解绑定到目标字段:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; public class SemicolonListDeserializer extends JsonDeserializer<List<String>> { @Override public List<String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String value = p.getText(); if (value == null || value.trim().isEmpty()) { return Collections.emptyList(); } // 如需可变List,可替换为 new ArrayList<>(Arrays.asList(value.split(";"))) return Arrays.asList(value.split(";")); } }
在POJO的目标字段上添加反序列化注解:
@Data public static class Wrapper{ private String requestId, requestSource; @JsonDeserialize(using = SemicolonListDeserializer.class) private List<String> documentIds, trackingIds; }
2. 在POJO的Setter方法中手动拆分
直接在字段的Setter方法里处理字符串拆分逻辑,无需额外编写反序列化器:
@Data public static class Wrapper{ private String requestId, requestSource; private List<String> documentIds, trackingIds; public void setDocumentIds(String documentIdsStr) { if (documentIdsStr == null || documentIdsStr.isBlank()) { this.documentIds = Collections.emptyList(); } else { // 如需可变List,替换为 new ArrayList<>(Arrays.asList(...)) this.documentIds = Arrays.asList(documentIdsStr.split(";")); } } public void setTrackingIds(String trackingIdsStr) { if (trackingIdsStr == null || trackingIdsStr.isBlank()) { this.trackingIds = Collections.emptyList(); } else { this.trackingIds = Arrays.asList(trackingIdsStr.split(";")); } } }
补充说明
如果你的CSV中存在分号转义的场景(比如内容本身包含分号),需要在拆分逻辑中额外处理转义规则,避免错误拆分。
内容的提问来源于stack exchange,提问作者DucanoidYoung
相关产品推荐
相关产品推荐

