递归对象写入平面csv文件

我需要写这样的对象

class User {
    UUID id;
    String name;
    Role role;
}

class Role {
    String name;
    LocalDate activeFrom;
    Authority owner;
}

class Authority {
    String name;
}

棘手的想法是,csv编写应该在对象树中递归地工作。还需要像2019-11-05 f.e.一样将LocalDate编写为字符串;

生成的csv文件应该是扁平的,看起来像:

user.id,user.name,user.role.name,user.role.activeFrom,user.role.owner.name

//示例值


我已经尝试过OpenCsv:

        StatefulBeanToCsv<User> beanToCsv = new StatefulBeanToCsvBuilder<User>(printWriter).build();
        try {
            beanToCsv.write(users);
        } catch (CsvDataTypeMismatchException | CsvRequiredFieldEmptyException e) {
            e.printStackTrace();
        }
        printWriter.close();

和Univocity解析器:

CsvWriterSettings settings = new CsvWriterSettings();
        ObjectRowWriterProcessor processor = new ObjectRowWriterProcessor();
        settings.setRowWriterProcessor(processor);
        processor.convertType(User.class,);

到目前为止没有运气。它们只能序列化为csv的顶级对象。同样在OpenCsv中,我还有序列化LocalDate的问题。 你能帮助我吗?咨询方法或图书馆?

shangxinde86 回答:递归对象写入平面csv文件

由于我没有得到任何答案,因此将描述我的解决方案。 我用过图书馆:

http://super-csv.github.io/super-csv/index.html

和扩展名:

https://super-csv.github.io/super-csv/dozer.html

代码:

import org.supercsv.io.dozer.CsvDozerBeanWriter;
import org.supercsv.prefs.CsvPreference;
import java.io.IOException;
import java.io.Writer;

static final String[] FIELD_MAPPING = new String[]{
    "user.id","user.name","user.role.name","user.role.activeFrom","user.role.owner.name"
};

    try (var beanWriter = new CsvDozerBeanWriter(printWriter,CsvPreference.STANDARD_PREFERENCE)) {
        beanWriter.configureBeanMapping(User.class,FIELD_MAPPING);
        beanWriter.writeHeader(FIELD_MAPPING);
        for (User user : users) {
            beanWriter.write(user);
        }
    }
    printWriter.close();

https://super-csv.github.io/super-csv/xref-test/org/supercsv/example/dozer/Writing.html

以及如何测试它:

@Test
void status_written_in_csv_format() {
    // Setup
    WriteCsvToResponse objectUnderTest = new WriteCsvToResponse ();
    StringWriter stringWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(stringWriter);

    // Given
    Status status = ...

    // When
    objectUnderTest.writeStatus(printWriter,status);

    // Then
    String actualCsv = stringWriter.toString();
    assertThat(actualCsv.split("\n"))
       .as("Produced CSV")
       .containsExactly(
         "id,storeId,status","42,142,OK");
}

How to test a method using a PrintWriter?

,

在univocity解析器上,没有任何映射,您可以简单地使用@Nested注释嵌套的对象,它将起作用。

class User {
    ...

    @Nested
    Role role;
}
本文链接:https://www.f2er.com/3161390.html

大家都在问