You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:55:14