使用Jackson将CSV解析为包含嵌套POJO的POJO
使用Jackson CSV实现嵌套POJO映射
完全可以通过CsvSchema或CsvMapper实现指定列到嵌套POJO的映射,以下是具体实现方式:
1. 调整POJO(可选但更清晰)
可以通过注解明确字段与列的关联,同时注意CSV中的浮点值与OtherPojo中int类型的兼容问题(建议将OtherPojo字段改为double以保留小数,若坚持int,Jackson会自动截断小数部分):
import com.fasterxml.jackson.annotation.JsonProperty; public class SomePojo { public String name; public int type; @JsonProperty("ref") public OtherPojo ref; } public class OtherPojo { // 若需保留CSV中的小数,建议改为double类型 public int x, y, z; }
2. 构建CsvSchema并完成映射
通过CsvSchema.Builder将x、y、z列绑定到ref对象的对应字段:
import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.fasterxml.jackson.dataformat.csv.CsvSchema; import java.io.File; import java.util.List; public class CsvNestedMappingDemo { public static void main(String[] args) throws Exception { CsvMapper mapper = new CsvMapper(); // 定义Schema,关联列与嵌套对象字段 CsvSchema schema = CsvSchema.builder() .addColumn("name") .addColumn("type", CsvSchema.ColumnType.NUMBER) .addColumn("x", CsvSchema.ColumnType.NUMBER) .addColumn("y", CsvSchema.ColumnType.NUMBER) .addColumn("z", CsvSchema.ColumnType.NUMBER) .setUseHeader(true) .withColumnReordering(true) // 核心配置:将x/y/z映射到ref对象的对应字段 .withNestedSchema("ref", CsvSchema.builder() .addColumn("x") .addColumn("y") .addColumn("z") .build()) .build(); // 读取CSV并转换为POJO列表 List<SomePojo> pojoList = mapper.readerFor(SomePojo.class) .with(schema) .readValues(new File("your-csv-file.csv")) .readAll(); // 验证结果 for (SomePojo pojo : pojoList) { System.out.println("名称:" + pojo.name + ",类型:" + pojo.type); System.out.println("嵌套对象:x=" + pojo.ref.x + ",y=" + pojo.ref.y + ",z=" + pojo.ref.z); } } }
3. 关键注意事项
- 若CSV列名带有空格(如你提供的
x),需在Schema的addColumn中匹配空格,或提前清理CSV的列名空格。 - 若不想通过代码构建Schema,也可以直接在
OtherPojo的字段上添加@JsonProperty指定列名,比如@JsonProperty(" x")。 - 类型不匹配时(如浮点转int),Jackson会自动做类型转换,但可能丢失精度,需根据业务需求调整字段类型。
内容的提问来源于stack exchange,提问作者pstatix
相关产品推荐
相关产品推荐

