【问题标题】:OpenCSV convert csv to nested beanOpenCSV 将 csv 转换为嵌套 bean
【发布时间】:2017-01-18 21:47:33
【问题描述】:

我们正在使用 OpenCSV。 csv是

id,fname,lname,address.line1,address.line2

豆子是

Person{
  String id;
  String lname;
  String fname;
  Address address;
}

Address{
  String line1;
  String line2;  
}

是否可以用 opencsv 填充嵌套的 Address 对象! opencsv.beanopencsv.bean.customconverter 有一些课程似乎可以做我想做的事,但我找不到任何示例。

我看过 Parse CSV to multiple/nested bean types with OpenCSV? 但答案集中在 SuperCSV,这不是我想要的。

【问题讨论】:

  • 你有解决办法吗?
  • 也有兴趣

标签: java csv opencsv


【解决方案1】:

一种选择是创建一个自定义MappingStrategy 类并实现populateNewBean(...) 方法,为您提供根据需要填充bean 的方法。

看这个例子:

public void example() {
    Reader in = new StringReader(
            "1,Doe,John,123 Main St,\"Anytown, USA\"\n" +
            "2,Dean,James,111 Some St,\"Othertown, USA\"\n" +
            "3,Burger,Sam,99 Beach Avenue,\"Sometown, USA\"\n");
    CsvToBeanBuilder<Person> builder = new CsvToBeanBuilder<Person>(in)
            .withMappingStrategy(new PersonMappingStrategy());
    CsvToBean<Person> ctb = builder.build();
    for (Person person : ctb.parse()) {
        System.out.println(
                person.id
                + "\t" + person.lname
                + "\t" + person.fname
                + "\t" + person.address.line1
                + "\t" + person.address.line2);
    }
}

class Person {
    String id;
    String lname;
    String fname;
    Address address;
}

class Address {
    String line1;
    String line2;  
}

class PersonMappingStrategy extends ColumnPositionMappingStrategy {

    public PersonMappingStrategy() {
        this.setType(Person.class);
    }

    @Override
    public Object populateNewBean(String[] line) throws CsvBeanIntrospectionException, CsvRequiredFieldEmptyException,
    CsvDataTypeMismatchException, CsvConstraintViolationException, CsvValidationException {
        Person person = new Person();
        person.id = line[0];
        person.lname = line[1];
        person.fname = line[2];
        person.address = new Address();
        person.address.line1 = line[3];
        person.address.line2 = line[4];
        return person;
    }

}

输出是

1       Doe     John    123 Main St     Anytown, USA
2       Dean    James   111 Some St     Othertown, USA
3       Burger  Sam     99 Beach Avenue Sometown, USA

【讨论】:

  • 我需要完全相反。你能举一些嵌套bean转换为csv的例子吗?谢谢。
  • @Saurabhcdt,写信a new question
【解决方案2】:

在 OpenCSV 5.0 中,我们可以通过 @CsvRecurse 注解映射嵌套 bean。文档如下

指示映射策略在成员变量中查找 进一步的映射注释。

请查看OpenCSV: Mapping a Nested Bean to a CSV file

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2020-04-02
    • 2020-10-28
    • 2022-01-07
    相关资源
    最近更新 更多