如何使用 opencsv 构建(工作)自定义转换器

Sau*_*uss 5 java converters opencsv

我正在使用带有嵌套 bean 结构的 OpenCSV。但是,我需要一个自定义转换器来实现这一点(目前专注于写入 csv 部分)。我环顾四周,但没有找到任何示例来帮助我弄清楚如何使其工作。

我尝试扩展我的子 bean 类,并在主文档中提供了一些转换。但是我的资源已经用完了,我来得最远的是让它抛出一个 CsvBadConverterException。

让我告诉你我有什么。(User 和 UserScore 都实现了 Serializable,以防万一。)父 bean:User

    @CsvBindByName(column = "username")
    private String userName;
    @CsvBindByName(column = "password")
    private String userPassword;
    @CsvBindByName(column = "rememberPassword")
    private boolean rememberPassword;
    @CsvBindByName(column = "rememberUser")
    private boolean rememberUser;
    @CsvCustomBindByName(column = "scores", converter = UserScoreToBean.class)
    private UserScore userScore;

    // Constructors, getters, setters, and other methods
Run Code Online (Sandbox Code Playgroud)

子 bean:UserScore

    @CsvBindByName(column = "totalScore")
    private int totalScore;
    @CsvBindByName(column = "currentScore")
    private int currentScore;
    @CsvBindByName(column = "highestStreak")
    private int highestStreak;

    // Even more basic getter, setter, etc.
Run Code Online (Sandbox Code Playgroud)

转换器:UserScoreToBean

    public abstract class UserScoreToBean extends AbstractBeanField<User> {
    @Override
    protected Object convert(String s) {
        UserScore score = new UserScore();
        String[] split = s.split(".", 3);
        score.setTotalScore(Integer.valueOf(split[0]));
        score.setCurrentScore(Integer.valueOf(split[1]));
        score.setHighestStreak(Integer.valueOf(split[2]));
        return score;
//        return null;
    }

    @Override
    protected String convertToWrite(Object value) throws CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
        UserScore score = (UserScore) value;

        return "\"" + score.getTotalScore() + "." + score.getCurrentScore() + "." + score.getHighestStreak() + "\"";
//        return super.convertToWrite(value);
    }
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,我的转换器非常基础。所以我很乐意为您提供任何帮助。为了便于故障排除,我刚刚让我的程序尝试在开始时生成一个标题,这给了我这个异常:

com.opencsv.exceptions.CsvBadConverterException:实例化自定义转换器 settings.user.UserScoreToBean 时出现问题。

谢谢阅读!

小智 2

使用 opencsv 5.0 及其新注释@CsvRecurse。然后,嵌套对象中的项目将作为顶层出现在 csv 中。

如果您出于某种原因无法更改库,那么我会查看“CsvBindAndSplitByName”注释,但这需要一些调整。