【问题标题】:Write csv file with pojo containing nested collections使用包含嵌套集合的 pojo 编写 csv 文件
【发布时间】:2021-01-11 22:32:50
【问题描述】:

我需要使用 jackson lib 将 pojo 导出到 csv。我的 pojo 类包含嵌套对象(集合)。我想将嵌套集合导出为列。

 public class PojoToCsv {
    private String label;
    private Set<String> names;
    @JsonUnwrapped
    private List<Address> addresses;

    public PojoToCsv() {
    }

    
    public PojoToCsv(String label, Set<String> names, List<Address> addresses) {
        this.label = label;
        this.names = names;
        this.addresses = addresses;
    }
    //Setters & Getters
public class Address {
    private String zipCode;
    private String mail;
    private int vatNumber;

以这组数据为例:

Address address1 = new Address("label1","name1",1);
        Address address2 = new Address("label2","name2",2);
        Address address3 = new Address("label3","name3",3);
        Address address4 = new Address("label4","name4",4);

        PojoToCsv pojoToCsv1 = new PojoToCsv("value1", Stream.of("baba","bobo").collect(Collectors.toSet()), Arrays.asList(address1,address2));
        PojoToCsv pojoToCsv2 = new PojoToCsv("value2", Stream.of("tata","toto").collect(Collectors.toSet()), Arrays.asList(address3,address4));

csv 文件应该是这样的:

label,names,addresses
"value1",["baba","bobo"],[{"zipCode":"label1","mail":"name1","vatNumber":1},{"zipCode":"label2","mail":"name2","vatNumber":2}]
"value2",["tata","toto"],[{"zipCode":"label3","mail":"name3","vatNumber":3},{"zipCode":"label4","mail":"name4","vatNumber":4}]

这是我的实际代码:

        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.convertValue(generatePojoList(), JsonNode.class);

        CsvSchema.Builder csvSchemaBuilder = CsvSchema.builder();
        JsonNode firstNode = node.elements().next();
        firstNode.fieldNames().forEachRemaining(name -> {csvSchemaBuilder.addColumn(name);});
        CsvSchema csvSchema = csvSchemaBuilder.build().withHeader();

        CsvMapper csvMapper = new CsvMapper();
        csvMapper.enable(CsvParser.Feature.WRAP_AS_ARRAY);

        csvMapper.writerFor(JsonNode.class)
                .with(csvSchema)
                .writeValue(new File("src/main/resources/export.csv"), node);

我仍然收到异常 CsvMappingException:CSV 生成器不支持属性的对象值(嵌套对象)

【问题讨论】:

    标签: java csv export-to-csv


    【解决方案1】:

    这是一个使用 Apache Commons CSV 库的解决方案:

    ObjectMapper objectMapper = new ObjectMapper();
            CSVPrinter csvPrinter = null;
            FileWriter fileWriter = null;
            CSVFormat csvFormat = CSVFormat.DEFAULT.withRecordSeparator("\n");
            final Object[] CSV_FILE_HEADERS = {"label", "names", "addresses"};
            try {
                fileWriter = new FileWriter("export.csv");
                csvPrinter = new CSVPrinter(fileWriter, csvFormat);
                csvPrinter.printRecord(CSV_FILE_HEADERS);
                for (PojoToCsv csvObject : generatePojoList()) {
                    List<String> data = Arrays.asList(
                            csvObject.getLabel(),
                            String.valueOf(objectMapper.writeValueAsString(csvObject.getNames())),
                            String.valueOf(objectMapper.writeValueAsString(csvObject.getAddresses()))
                    );
                    csvPrinter.printRecord(data);
                }
            } catch (Exception e) {
                System.out.println("CSV writing error");
                e.printStackTrace();
            } finally {
                try {
                    fileWriter.flush();
                    fileWriter.close();
                    csvPrinter.close();
                } catch (IOException e) {
                    System.out.println("closing error");
                    e.printStackTrace();
                }
            }
    

    其中 generatePojoList() 是提供要导出的 pojo 集合的方法。

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多