递归对象写入平面csv文件

递归对象写入平面csv文件,csv,recursion,tree,hierarchy,univocity,Csv,Recursion,Tree,Hierarchy,Univocity,我需要写这样的东西 class User { UUID id; String name; Role role; } class Role { String name; LocalDate activeFrom; Authority owner; } class Authority { String name; } 一个棘手的想法是csv编写应该通过对象树递归地工作。还需要将LocalDate写为类似2019-11-05 f.e.的字符

我需要写这样的东西

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

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

class Authority {
    String name;
}
一个棘手的想法是csv编写应该通过对象树递归地工作。还需要将LocalDate写为类似2019-11-05 f.e.的字符串

生成的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();
到目前为止运气不好。它们只能序列化为csv顶级对象。在OpenCsv中,我还遇到了序列化LocalDate的问题。
你能帮助我吗?建议方法或库?

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

和扩展:

代码:

以及如何测试它:

@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");
}

在univocity解析器上,无需任何映射,只需使用
@nested
注释嵌套对象即可

class User {
    ...

    @Nested
    Role role;
}
@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");
}
class User {
    ...

    @Nested
    Role role;
}